首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JTable复选框(布尔值)列不可编辑

JTable复选框(布尔值)列不可编辑
EN

Stack Overflow用户
提问于 2018-06-07 19:31:15
回答 1查看 548关注 0票数 -1

我制作了一个JTable,并为其实现了自定义表格模型,以呈现布尔值的复选框。我遇到的问题是复选框是不可编辑的。

代码语言:javascript
复制
public class JTableBooleanAsCheckbox extends JPanel {
public JTableBooleanAsCheckbox() {
    initializeUI();
}

private void initializeUI() {
    setLayout(new BorderLayout());
    setPreferredSize(new Dimension(450, 150));

    JTable table = new JTable(new BooleanTableModel());
    table.setFillsViewportHeight(true);
    JScrollPane pane = new JScrollPane(table);
    add(pane, BorderLayout.CENTER);
}

public static void showFrame() {
    JPanel panel = new JTableBooleanAsCheckbox();
    panel.setOpaque(true);

    JFrame frame = new JFrame("JTable Boolean as Checkbox");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(panel);
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JTableBooleanAsCheckbox.showFrame();
        }
    });
}

表模型如下所示。

代码语言:javascript
复制
class BooleanTableModel extends AbstractTableModel {
    String[] columns = {"STUDENT ID", "NAME", "SCORE", "PASSED"};
    Object[][] data = {
            {"S001", "ALICE", 90.00, Boolean.TRUE},
            {"S002", "BOB", 45.50, Boolean.FALSE},
            {"S003", "CAROL", 60.00, Boolean.FALSE},
            {"S004", "MALLORY", 75.80, Boolean.TRUE}
    };

    public int getRowCount() {
        return data.length;
    }

    public int getColumnCount() {
        return columns.length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return data[rowIndex][columnIndex];
    }

    @Override
    public String getColumnName(int column) {
        return columns[column];
    }

    //
    // This method is used by the JTable to define the default
    // renderer or editor for each cell. For example if you have
    // a boolean data it will be rendered as a check box. A
    // number value is right aligned.
    //
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return data[0][columnIndex].getClass();
    }
    @Override
    public boolean isCellEditable(int rowIndex,int columnIndex) {
        if(rowIndex == 3)
           return true;
        return false;
    }
}

这里出了什么问题?我为包含复选框的单元格设置了可编辑单元格。仍然无法更改复选框的状态(选中或取消选中)。

EN

回答 1

Stack Overflow用户

发布于 2018-06-07 19:57:20

您的BooleanTableModelisCellEditable方法中存在错误。您需要检查columnIndex == 3,而不是rowIndex == 3。它应该是:

代码语言:javascript
复制
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    if(columnIndex == 3)
       return true;
    return false;
}

此外,您需要覆盖它的setValueAt方法,因为AbstractTableModelsetValueAt方法什么也不做:

代码语言:javascript
复制
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    data[rowIndex][columnIndex] = aValue;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50740103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档