如何获取for循环JTable中所有行的复选框?

时间:2017-11-02 11:53:36

标签: java swing jtable jcheckbox

我设法在eclipse中创建了一个表。该表具有编号的行。这是代码:

public class JTableRowHeader {

    private JFrame frame = new JFrame("JTable RowHeader");
    private JScrollPane scrollPane;
    private JTable table;
    private DefaultTableModel model;
    private TableRowSorter<TableModel> sorter;
    private JTable headerTable;
    private JCheckBox chckbxNewCheckBox; // declared check box
    private JCheckBox all;
    //private List<JCheckBox> checkBoxes;


    public JTableRowHeader() {
        int NoOfRows = 60;
        table = new JTable(NoOfRows, 2);
        for (int i = 0; i < table.getRowCount(); i++) {
            table.setValueAt(i, i, 0);
        }
        sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);
        model = new DefaultTableModel() {

        };



        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                model.fireTableRowsUpdated(0, model.getRowCount() - 1);
            }
        });
        scrollPane = new JScrollPane(table);
        scrollPane.setRowHeaderView(headerTable);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(scrollPane);

        chckbxNewCheckBox = new JCheckBox("New check box");
        scrollPane.setColumnHeaderView(chckbxNewCheckBox);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if (info.getName().equals("Nimbus")) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            //e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JTableRowHeader TestTableRowHeader = new JTableRowHeader();
                frame.add(new CheckBoxGroup(); //trying to add the check box
            }
        });
    }
}

现在我已创建表格,我希望为表格中的所有行添加一个复选框。当我更改表格中的行数时,我还希望复选框可以更改如果我有4行我想要4个复选框,如果我将其增加到60行,我想要60个复选框。我尝试过几次尝试但都失败了。我是相当新的,所以任何使用我的代码的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

阅读How to Use Tables上Swing教程中的部分,了解基础知识和工作示例,以帮助您入门。

关键是:

  1. 您需要覆盖DefaultTableModel的getColumnClass(...)方法,以返回带有组合框的列的Boolean.class。

  2. 然后在您设置数据的循环中,您需要将数据添加到TableModel。

  3. 所以代码就像:

    table.setValueAt(i, i, 0);
    table.setValueAt(Boolean.FALSE, I, 1); // add the check box
    
      

    我想在没有Object []方法

    的情况下这样做

    是的,这是更好的方法。您永远不应该创建具有固定大小的TableModel。创建具有0行的表,然后使用addRow(...)方法让表在添加数据行时动态增长。

    这比使用setValueAt(...)更好。

答案 1 :(得分:0)

您必须创建一个包含布尔字段的模式(使用默认复选框显示)

public class MyTableModel extends DefaultTableModel implements TableModel {

    private List<JCheckBox> list;

    public List<JCheckBox> getList() {
        return list;
    }

    public void setList(List<JCheckBox> list) {
        this.list = list;
        fireTableDataChanged();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public int getRowCount() {
        if(list != null) {
            return list.size();
        }

        return super.getRowCount();
    }

    @Override
    public Class<?> getColumnClass(int column) {
        if(column == 0) {
            return Boolean.class;
        }

        return super.getColumnClass(column);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return column == 0;
    }

    @Override
    public Object getValueAt(int row, int column) {
        if(column == 0) {
            return list.get(row).isSelected();
        }

        return "";
    }

    @Override
    public void setValueAt(Object aValue, int row, int column) {
        if(column == 0) {
            list.get(row).setSelected((Boolean) aValue);
        }
    }
}

这就是,例如,使用JCheckBox对象的数组/列表进行初始化(虽然没有特别的实际意义......)

public class JTableRowHeader {
    private JFrame frame;
    private JScrollPane scrollPane;
    private JTable table;

    public JTableRowHeader() {
        table = new JTable(new MyTableModel());
        scrollPane = new JScrollPane(table);

        frame = new JFrame("JTable RowHeader");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JTableRowHeader testTableRowHeader = new JTableRowHeader();

            JCheckBox checkBoxes[] = new JCheckBox[60];
            for(int i = 0; i < checkBoxes.length; i++) {
                checkBoxes[i] = new JCheckBox("Check box " + i);
            }

            ((MyTableModel)testTableRowHeader.table.getModel()).setList(Arrays.asList(checkBoxes));
        });
    }
}