代码之家  ›  专栏  ›  技术社区  ›  Jaran

仅一个JTable单元格中的复选框

  •  0
  • Jaran  · 技术社区  · 11 年前

    我想创建一个 JTable 有两列,看起来像一个调查。 所以左边是问题,右边是用户可以给出答案。 但在一行中,右侧应该有一个复选框,这样用户只能回答是或否。

    这可能与 JTable表格 ,我怎样才能做到这一点?

    当做

    2 回复  |  直到 11 年前
        1
  •  1
  •   dic19    11 年前

    您在评论中指出:

    我用一列JCheckbox尝试过它,但我只是希望它在 一个电池

    注意,这个要求有点棘手。我想你可以超越 getCellRenderer(int row, int column) getCellEditor(int row, int column) 方法请求单元格值的类。

    这样,单元格渲染器/编辑器将成为 JCheckbox 即使表的行被排序或表的列被重新排列。

    类似于:

        JTable table = new JTable(model) {
            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if(getValueAt(row, column) instanceof Boolean) {
                    return super.getDefaultRenderer(Boolean.class);
                } else {
                    return super.getCellRenderer(row, column);
                }
            }
    
            @Override
            public TableCellEditor getCellEditor(int row, int column) {
                if(getValueAt(row, column) instanceof Boolean) {
                    return super.getDefaultEditor(Boolean.class);
                } else {
                    return super.getCellEditor(row, column);
                }
            }
        };
    

    实例

    这里是一个完整的例子。

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
    
    public class Demo {
    
        private void createAndShowGUI() { 
    
            DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0);
            model.addRow(new Object[]{"Property # 1", "Value # 1"});
            model.addRow(new Object[]{"Property # 2", Boolean.TRUE});
            model.addRow(new Object[]{"Property # 3", "Value # 3"});
    
            JTable table = new JTable(model) {
                @Override
                public TableCellRenderer getCellRenderer(int row, int column) {
                    if(getValueAt(row, column) instanceof Boolean) {
                        return super.getDefaultRenderer(Boolean.class);
                    } else {
                        return super.getCellRenderer(row, column);
                    }
                }
    
                @Override
                public TableCellEditor getCellEditor(int row, int column) {
                    if(getValueAt(row, column) instanceof Boolean) {
                        return super.getDefaultEditor(Boolean.class);
                    } else {
                        return super.getCellEditor(row, column);
                    }
                }
            };
            table.setAutoCreateRowSorter(true);
    
            JFrame frame = new JFrame("Demo");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(new JScrollPane(table));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {                
                    new Demo().createAndShowGUI();
                }
            });
        }    
    }
    

    屏幕截图

    enter image description here

        2
  •  1
  •   Slimu    11 年前

    您可以实现接口TableCellRenderer,为具有不同对象(如JTextField和JLabel)的单元格创建自定义渲染器。您必须实现getTableCellRendererComponent方法,并从中返回一个组件(如JPanel或您希望的组件),其中包含您希望在单元格上显示的组件。在表中,您将使用JTable.setDefaultRenderer()为自定义类设置新的渲染器。

    如果只有2个值,也许还可以将数据设置为布尔值,并让表将其显示为CheckBox(默认呈现)。

    这是第二个方法的代码,看起来更像您想要的。

    class CheckBoxModel extends AbstractTableModel{
    
            private final Object[][] rowData = {{"John" , true}, {"Mary", false}};
            final String columnNames[] = { "Student", "Approve" };
    
            @Override
            public int getRowCount() {
                return rowData.length;
            }
    
            @Override
            public int getColumnCount() {
                return columnNames.length;
            }
    
            @Override
            public Class<?> getColumnClass(final int columnIndex) {
                if (columnIndex == 1) {
                    return Boolean.class; //renders column as a CheckBox
                }
                return super.getColumnClass(columnIndex);
            }
    
            @Override
            public Object getValueAt(final int rowIndex, final int columnIndex) {
                return rowData[rowIndex][columnIndex];
            }
    
            @Override
            public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
                rowData[rowIndex][columnIndex] = aValue;
                fireTableCellUpdated(rowIndex, columnIndex);
            }
    
            @Override
            public boolean isCellEditable(final int rowIndex, final int columnIndex) {
                return true;    //makes all cells editable
            }
    }
    

    以及一个测试类:

    public class TestTable {
    
        public static void main(String[] args) {
            final JFrame frame = new JFrame("Editable Color Table");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            final JTable table = new JTable(new CheckBoxModel());
            final JScrollPane scrollPane = new JScrollPane(table);
            frame.add(scrollPane, BorderLayout.CENTER);
            frame.setSize(500, 500);
            frame.setVisible(true);
        }
    }