JTable中的JCheckBox值

检查JCheckBox但是当我使用system.out.print时它仍然将其值显示为false。如果焦点丢失但仍检查JCheckBox则返回true。 即,当我选中2复选框时,结果显示是第一个复选框。 未显示第二个复选框的状态。 完成编程如下所示:请运行编程并纠正我的错误。 欢迎任何帮助。

 public class check extends JFrame { public check() { setBounds(00, 40, 400, 400); Color c = new Color(160, 200, 100); getContentPane().setBackground(c); Color c3 = new Color(0, 50, 50, 2); setTitle("MARKING OF TARGET HABITATION"); setUndecorated(true); getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] columnNames = {"Country", "Capital", "Population in Millions", "Democracy"}; Object[][] data = { {"USA", "Washington DC", 280, new Boolean(false)}, {"Canada", "Ottawa", 32, new Boolean(false)}, {"United Kingdom", "London", 60, new Boolean(false)}, {"Germany", "Berlin", 83, new Boolean(false)}, {"France", "Paris", 60, new Boolean(false)}, {"Norway", "Oslo", 4.5, new Boolean(false)}, {"India", "New Deli", 1046, new Boolean(false)} }; final JTable table = new JTable(data, columnNames) { public boolean isCellEditable(int rowIndex, int colIndex) { return (colIndex == 3);//Disallow the editing of any cell } }; table.getColumnModel().getColumn(3).setCellEditor(new CheckBoxCellEditor()); table.getColumnModel().getColumn(3).setCellRenderer(new CWCheckBoxRenderer()); JScrollPane scrollPane = new JScrollPane(table); JButton button = new JButton("check"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { boolean[] rsel = new boolean[table.getRowCount()]; for (int i = 0; i < table.getRowCount(); i++) { rsel[i] = (boolean) table.getValueAt(i, 3); if (rsel[i]) { System.out.println("checkbox selected at row" + " " + i + "is" + rsel[i]); for (int col = 0; col <= 3; col++) { table.getValueAt(i, col); System.out.println("data at row" + " " + i + "is" + table.getValueAt(i, col)); } } } } }); JPanel buttonpanel = new JPanel(); buttonpanel.add(button); add(scrollPane, BorderLayout.CENTER); add(buttonpanel, BorderLayout.SOUTH); Color c1 = new Color(160, 200, 100); table.setBackground(c1); buttonpanel.setBackground(c1); setBackground(c1); setVisible(true); } public static void main(String args[]) { new check(); } class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1L; protected JCheckBox checkBox; public CheckBoxCellEditor() { checkBox = new JCheckBox(); checkBox.setHorizontalAlignment(SwingConstants.CENTER); // checkBox.setBackground( Color.white); } public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { checkBox.setSelected(((Boolean) value).booleanValue()); return checkBox; } public Object getCellEditorValue() { return Boolean.valueOf(checkBox.isSelected()); } } class CWCheckBoxRenderer extends JCheckBox implements TableCellRenderer { private static final long serialVersionUID = 1L; Border border = new EmptyBorder(1, 2, 1, 2); public CWCheckBoxRenderer() { super(); setOpaque(true); setHorizontalAlignment(SwingConstants.CENTER); } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Boolean) { setSelected(((Boolean) value).booleanValue()); //setEnabled(table.isCellEditable(row, column)); setForeground(table.getForeground()); setBackground(table.getBackground()); } return this; } } } 

可能最好覆盖模型中的getColumnClass以返回Boolean。 默认渲染器/编辑器处理大小写,您可以看到/使用复选框。

作为参考,这个sscce说明了@StanislavL的观点。 请注意,Java 5中引入的自动装箱导致第三列具有Boolean类型。 在运行时,重写的getColumnClass()将返回索引CHECK_COL Boolean.class 。 最后,应在事件派发线程上构建Swing GUI对象。

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Check extends JFrame { private static final int CHECK_COL = 3; public Check() { setTitle("MARKING OF TARGET HABITATION"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] columnNames = { "Country", "Capital", "Population in Millions", "Democracy"}; Object[][] data = { {"USA", "Washington DC", 280, true}, {"Canada", "Ottawa", 32, false}, {"United Kingdom", "London", 60, false}, {"Germany", "Berlin", 83, false}, {"France", "Paris", 60, false}, {"Norway", "Oslo", 4.5, false}, {"India", "New Deli", 1046, false} }; DefaultTableModel dtm = new DefaultTableModel(data, columnNames) { @Override public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } @Override public boolean isCellEditable(int rowIndex, int colIndex) { return (colIndex == CHECK_COL); } }; final JTable table = new JTable(dtm); JScrollPane scrollPane = new JScrollPane(table); JButton button = new JButton("check"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (int row = 0; row < table.getRowCount(); row++) { Boolean b = ((Boolean) table.getValueAt(row, CHECK_COL)); if (b.booleanValue()) { System.out.print("row " + row + " is " + b + ": "); for (int col = 0; col < table.getColumnCount(); col++) { System.out.print(table.getValueAt(row, col) + " "); } System.out.println(); } } } }); JPanel buttonpanel = new JPanel(); buttonpanel.add(button); add(scrollPane, BorderLayout.CENTER); add(buttonpanel, BorderLayout.SOUTH); pack(); setLocationByPlatform(true); setVisible(true); } public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Check(); } }); } }