Checkbox in only one JTable Cell

前端 未结 2 1023
臣服心动
臣服心动 2021-01-28 04:40

I want to create an JTable with 2 columns, which looks like a survey. So on the left are the questions and on the right the user can give his answers. But in one li

2条回答
  •  长发绾君心
    2021-01-28 05:08

    You have stated in a comment:

    I tried it with a column of JCheckboxes it works but I just want it in one cell

    Note this requirement is a little tricky. I think you can override getCellRenderer(int row, int column) and getCellEditor(int row, int column) methods asking for the cell value's class.

    This way the cell renderer/editor will be a JCheckbox even when the table's rows are sorted or table's columns are rearranged.

    Something like this:

        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);
                }
            }
        };
    

    Example

    Here a complete example to play with.

    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();
                }
            });
        }    
    }
    

    Screenshots

    enter image description here

提交回复
热议问题