在 JTable 中插入 JCheckBox 和 JComboBox
Insert a JCheckBox and JComboBox inside a JTable
我想在同一列中插入一个 CheckBox 和一个 ComboBox,但这有点棘手,我似乎找不到同时呈现两者的解决方案。有人可以帮我弄这个吗?我将不胜感激。
我要实现的 Jtable 如下:
这个例子可能会解决你的问题
import java.awt.Component;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
/**
* <code>CellBasedTable</code>.
*/
public class CellBasedTable extends JTable {
private static class TableCell {
/** Column of the cell. */
private final int column;
/** Row of the cell. */
private final int row;
/**
* Creates cell with the given row and column.
*
* @param aRow row of cell.
* @param aColumn column of cell.
*/
public TableCell(int aRow, int aColumn) {
row = aRow;
column = aColumn;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof TableCell) {
TableCell another = (TableCell) obj;
return row == another.row && column == another.column;
}
return false;
}
@Override
public int hashCode() {
return Arrays.hashCode(new int[] {row, column});
}
}
private final Map<TableCell, TableCellRenderer> rendererMap = new HashMap<>();
private final Map<TableCell, TableCellEditor> editorMap = new HashMap<>();
/**
*
*/
public CellBasedTable() {
}
/**
* @param dm
*/
public CellBasedTable(TableModel dm) {
super(dm);
}
public void setCellRenderer(int row, int column, TableCellRenderer r) {
rendererMap.put(new TableCell(row, column), r);
}
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
return rendererMap.getOrDefault(new TableCell(row, column), super.getCellRenderer(row, column));
}
public void setCellEditor(int row, int column, TableCellEditor e) {
editorMap.put(new TableCell(row, column), e);
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
return editorMap.getOrDefault(new TableCell(row, column), super.getCellEditor(row, column));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(CellBasedTable::startDemo);
}
private static void startDemo() {
DefaultTableModel model = new DefaultTableModel(new Object[] {"Subject", "Value"}, 0);
model.addRow(new Object[] {"name", "Variable"});
model.addRow(new Object[] {"Stored", Boolean.TRUE});
model.addRow(new Object[] {"Stroed Arguments", "job"});
JComboBox<String> combo = new JComboBox<>(new String[] {"task", "job", "rule"});
CellBasedTable tbl = new CellBasedTable(model);
tbl.setCellRenderer(1, 1, tbl.getDefaultRenderer(Boolean.class));
tbl.setCellEditor(1, 1, tbl.getDefaultEditor(Boolean.class));
tbl.setCellRenderer(2, 1, new ComboRenderer(combo));
tbl.setCellEditor(2, 1, new DefaultCellEditor(combo));
tbl.setRowHeight(24);
JFrame frm = new JFrame("TableTest");
frm.add(new JScrollPane(tbl));
frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frm.pack();
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class ComboRenderer implements TableCellRenderer {
private final JComboBox<?> combo;
/**
*
*/
public ComboRenderer(JComboBox<?> combo) {
this.combo = combo;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
combo.setSelectedItem(value);
combo.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
combo.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
return combo;
}
}
}
我想在同一列中插入一个 CheckBox 和一个 ComboBox,但这有点棘手,我似乎找不到同时呈现两者的解决方案。有人可以帮我弄这个吗?我将不胜感激。
我要实现的 Jtable 如下:
这个例子可能会解决你的问题
import java.awt.Component;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
/**
* <code>CellBasedTable</code>.
*/
public class CellBasedTable extends JTable {
private static class TableCell {
/** Column of the cell. */
private final int column;
/** Row of the cell. */
private final int row;
/**
* Creates cell with the given row and column.
*
* @param aRow row of cell.
* @param aColumn column of cell.
*/
public TableCell(int aRow, int aColumn) {
row = aRow;
column = aColumn;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof TableCell) {
TableCell another = (TableCell) obj;
return row == another.row && column == another.column;
}
return false;
}
@Override
public int hashCode() {
return Arrays.hashCode(new int[] {row, column});
}
}
private final Map<TableCell, TableCellRenderer> rendererMap = new HashMap<>();
private final Map<TableCell, TableCellEditor> editorMap = new HashMap<>();
/**
*
*/
public CellBasedTable() {
}
/**
* @param dm
*/
public CellBasedTable(TableModel dm) {
super(dm);
}
public void setCellRenderer(int row, int column, TableCellRenderer r) {
rendererMap.put(new TableCell(row, column), r);
}
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
return rendererMap.getOrDefault(new TableCell(row, column), super.getCellRenderer(row, column));
}
public void setCellEditor(int row, int column, TableCellEditor e) {
editorMap.put(new TableCell(row, column), e);
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
return editorMap.getOrDefault(new TableCell(row, column), super.getCellEditor(row, column));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(CellBasedTable::startDemo);
}
private static void startDemo() {
DefaultTableModel model = new DefaultTableModel(new Object[] {"Subject", "Value"}, 0);
model.addRow(new Object[] {"name", "Variable"});
model.addRow(new Object[] {"Stored", Boolean.TRUE});
model.addRow(new Object[] {"Stroed Arguments", "job"});
JComboBox<String> combo = new JComboBox<>(new String[] {"task", "job", "rule"});
CellBasedTable tbl = new CellBasedTable(model);
tbl.setCellRenderer(1, 1, tbl.getDefaultRenderer(Boolean.class));
tbl.setCellEditor(1, 1, tbl.getDefaultEditor(Boolean.class));
tbl.setCellRenderer(2, 1, new ComboRenderer(combo));
tbl.setCellEditor(2, 1, new DefaultCellEditor(combo));
tbl.setRowHeight(24);
JFrame frm = new JFrame("TableTest");
frm.add(new JScrollPane(tbl));
frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frm.pack();
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class ComboRenderer implements TableCellRenderer {
private final JComboBox<?> combo;
/**
*
*/
public ComboRenderer(JComboBox<?> combo) {
this.combo = combo;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
combo.setSelectedItem(value);
combo.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
combo.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
return combo;
}
}
}