JCheckBox in JTable
-
ich habe in meimem JTable eine spalte, in der ich JCheckBoxen einfügen möchte.
das einfügen hab ich mit hilfe folgenden FAQ Threads geschaft:
http://www.c-plusplus.net/forum/viewtopic.php?t=41372bei folgendem Programm habe ich für jede Zeile eine eigene CheckBox im CellEditor erstellt
die CheckBox kann angeklickt werden, wird jedoch eine andere CheckBox angeklickt, verschwindet das häckchen! (es ist allerdings immer noch selected, man sieht nur das häkchen nicht!)
klickt man auf eine checkbox, die selected ist (man sieht aber das häkchen nicht), ist die checkbox wieder ganz normal deselected.
kann mir jemand helfen und sagen, wie man das macht, dass die häckchen sichtbar bleiben?
public class CheckBoxCellEditor extends DefaultCellEditor { private String label; protected Vector checkBoxes = new Vector(); protected boolean initialised = false; public CheckBoxCellEditor(JCheckBox box) { super(box); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (!initialised) { for (int i = 0; i < table.getRowCount(); i++) { JCheckBox temp = new JCheckBox(); temp.setName("" +i); checkBoxes.add(temp); } initialised = true; } JCheckBox checkbox = (JCheckBox)checkBoxes.get(row); checkbox.setOpaque(true); if (isSelected) { checkbox.setForeground(table.getSelectionForeground()); checkbox.setBackground(table.getSelectionBackground()); } else { checkbox.setForeground(table.getForeground()); checkbox.setBackground(table.getBackground()); } label = (value == null) ? "" : value.toString(); checkbox.setText(label); return checkbox; } public Object getCellEditorValue() { return label; } } public class CheckboxCellRender extends JCheckBox implements TableCellRenderer { public CheckboxCellRender() { setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(UIManager.getColor("Checkbox.background")); } setText((value == null) ? "" : value.toString()); return this; } } public class Tester extends JFrame { protected DefaultTableColumnModel tableColumnModel = new DefaultTableColumnModel(); protected DefaultTableModel tableModel = null; protected JTable table = null; protected Container cp = getContentPane(); protected JScrollPane sp = null; protected JSplitPane spp = new JSplitPane(); public Tester () { for (int i = 0; i < 4; i++) { TableColumn column = new TableColumn(i); column.setHeaderValue("" + (i+1)); column.setResizable(false); column.setMaxWidth((i+1)* 30); tableColumnModel.addColumn(column); } tableModel = new DefaultTableModel(0,tableColumnModel.getColumnCount()); for (int i = 0; i < 10; i++) { Vector v = new Vector(); v.add(""); for (int j = 1; j < 4; j++) { v.add(new String("" + i + " " + j)); } tableModel.addRow(v); } table = new JTable(tableModel,tableColumnModel); table.getColumn("1").setCellEditor(new CheckBoxCellEditor(new JCheckBox())); table.getColumn("1").setCellRenderer(new CheckboxCellRender()); sp = new JScrollPane(table); spp.setLeftComponent(sp); spp.setRightComponent(new JPanel()); cp.add(spp); setSize(800,200); setExtendedState(MAXIMIZED_BOTH); addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent arg0) { System.exit(0); } public void windowClosing(WindowEvent arg0) { dispose(); } }); setVisible(true); } public static void main (String args[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception e) { } new Tester(); } }
-
Wieso machst du es dir denn so kompliziert? Hier mal ein Beispiel für eine JTable mit CheckBoxes:
public class JTableTest extends javax.swing.JFrame { public JTableTest() { initComponents(); } private void initComponents() { jButton1 = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); setDefaultCloseOperation(EXIT_ON_CLOSE); jButton1.setText("jButton1"); getContentPane().add(jButton1, java.awt.BorderLayout.SOUTH); jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null}, {null, null, null}, {null, null, null}, {null, null, null} }, new String [] { "String", "Object", "Boolean" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.Object.class, java.lang.Boolean.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); jScrollPane1.setViewportView(jTable1); getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); pack(); } public static void main(String args[]) { new JTableTest().setVisible(true); } private javax.swing.JButton jButton1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; }
-
so weit so gut! das hat funktioniert!
wie kann ich jetzt einstellen, dass ich den text in den anderen spalten nicht verändern kann, aber trotzdem die checkbox verwenden kann?
wie mach ich das, wenn ich nur in jeder 2. zeile eine checkbox haben will?