import javax.swing.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class JTableWithButtonAndCheckbox { public static void main(String[] args) { JFrame frame = new JFrame("JTable with Button and Checkbox"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyTableModel tableModel = new MyTableModel(); JTable table = new JTable(tableModel); JButtonRenderer buttonRenderer = new JButtonRenderer(); JButtonEditor buttonEditor = new JButtonEditor(new JCheckBox()); JCheckBoxRenderer checkboxRenderer = new JCheckBoxRenderer(); JCheckBoxEditor checkboxEditor = new JCheckBoxEditor(new JCheckBox()); TableColumn buttonColumn = table.getColumnModel().getColumn(1); buttonColumn.setCellRenderer(buttonRenderer); buttonColumn.setCellEditor(buttonEditor); TableColumn checkboxColumn = table.getColumnModel().getColumn(2); checkboxColumn.setCellRenderer(checkboxRenderer); checkboxColumn.setCellEditor(checkboxEditor); frame.add(new JScrollPane(table)); frame.pack(); frame.setVisible(true); } public static class MyTableModel extends AbstractTableModel { private Object[][] data = {{"Item 1", null, false}, {"Item 2", null, false}}; private String[] columnNames = {"Name", "Button", "Checkbox"}; @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return data.length; } @Override public Object getValueAt(int row, int col) { return data[row][col]; } @Override public Class<?> getColumnClass(int columnIndex) { return getValueAt(0, columnIndex).getClass(); } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public boolean isCellEditable(int row, int col) { return col != 0; } @Override public void setValueAt(Object aValue, int row, int col) { data[row][col] = aValue; fireTableCellUpdated(row, col); } } public static class JButtonRenderer extends JButton implements TableCellRenderer { public JButtonRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText((value == null) ? "" : value.toString()); return this; } } public static class JButtonEditor extends DefaultCellEditor { private JButton button; public JButtonEditor(JCheckBox checkBox) { super(checkBox); button = new JButton(); button.setOpaque(true); button.addActionListener(e -> fireEditingStopped()); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { button.setText((value == null) ? "" : value.toString()); return button; } } public static class JCheckBoxRenderer extends JCheckBox implements TableCellRenderer { public JCheckBoxRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setSelected((value != null && (Boolean) value)); return this; } } public static class JCheckBoxEditor extends DefaultCellEditor { private JCheckBox checkBox; public JCheckBoxEditor(JCheckBox checkBox) { super(checkBox); this.checkBox = new JCheckBox(); this.checkBox.setOpaque(true); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { checkBox.setSelected((value != null && (Boolean) value)); return checkBox; } } }


上一篇:
下一篇:
切换中文