获取JCheckBox使用重写的Jtable getValueAt()函数

时间:2014-07-05 19:10:39

标签: java swing jtable override jcheckbox

我需要一个JTable来反映动态数组的内容,所以我必须覆盖它的getValueAt函数。问题是现在表中的JCheckbox无法切换。

我一直在寻找答案,因为我认为这是一个非常常见的情况,但我找不到有效的解决方案,所以这是我最后的希望。

回到问题,这是我编码的测试JFrame:

package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class CheckboxTest extends JFrame {
    private JPanel contentPane;
    private JTable table;

    private Object[][] tableRows;


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    CheckboxTest frame = new CheckboxTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public CheckboxTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);


        tableRows = new Object[5][2];
        for (int i = 0; i < tableRows.length; i++) {
            tableRows[i][0] = new Boolean(i % 2 == 0);
            tableRows[i][1] = "Test";
        }

        table = new JTable(new DefaultTableModel(tableRows, new String[] {"", "Name"}){
            @Override public Class<?> getColumnClass(int col) {
                return (Class<?>) new Object[] { Boolean.class, String.class }[col];
            }

            @Override public boolean isCellEditable(int row, int col) {
                return true;
            }

            @Override public Object getValueAt(int row, int col) {
                return tableRows[row][col];
            }
        });
        scrollPane.setViewportView(table);
    }
}

2 个答案:

答案 0 :(得分:0)

您必须确保布尔列是可编辑的。你的DefaultTableModel的子类必须覆盖方法boolean isCellEditable(int rowIndex,int columIndex),它应该为columnIndex 0返回true)

答案 1 :(得分:-1)

自己找到解决方案。我只需要用

覆盖DefaultTableModel的setValueAt函数
@Override
public void setValueAt(Object value, int row, int col) {
    tableRows[row][col] = value;
}