Java JTable显示true/false,而不是复选框,尽管;getColumnClass";实施

Java JTable显示true/false,而不是复选框,尽管;getColumnClass";实施,java,Java,我有一个JTable,我想在其中以复选框的形式显示布尔值,它应该能够被编辑(选中/取消选中) 为了实现这一点,我实现了AbstractTableModel的一个子类,并实现了所有需要的方法getColumnClass和isCellEditable 问题是,显示的不是复选框,而是true/false。只有当我单击单元格时,才会调用getColumnClass方法,并且复选框会出现一小段时间 我发现,JTable在开始时从不调用“getColumnClass”,而是在我想在单元格中单击时调用 pub

我有一个JTable,我想在其中以复选框的形式显示布尔值,它应该能够被编辑(选中/取消选中)

为了实现这一点,我实现了AbstractTableModel的一个子类,并实现了所有需要的方法getColumnClass和isCellEditable

问题是,显示的不是复选框,而是true/false。只有当我单击单元格时,才会调用getColumnClass方法,并且复选框会出现一小段时间

我发现,JTable在开始时从不调用“getColumnClass”,而是在我想在单元格中单击时调用

public class OrderTableModel extends AbstractTableModel {
    private ArrayList<Orders> orders;
    private final String[] HEADER = {"Date", "isParty", "isHost"};

public OrderTableModel(ArrayList<Orders> orders)
{
    this.orders = orders;
}

public OrderTableModel(){
    orders = new ArrayList<>();
}

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

@Override
public int getRowCount() {
    return orders.size() > 20 ? orders.size() : 20;
}

@Override
public int getColumnCount() {
    return HEADER.length;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    System.out.println("in getColumnClass");
    switch(columnIndex)
    {
        case 1: return Boolean.class;
        case 2: return Boolean.class;
        default: return String.class;
    }

}


@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    ...
}
公共类OrderTableModel扩展了AbstractTableModel{
私人ArrayList订单;
私有最终字符串[]头={“日期”、“isParty”、“isHost”};
public OrderTableModel(ArrayList orders)
{
这个。订单=订单;
}
public OrderTableModel(){
orders=新的ArrayList();
}
@凌驾
公共字符串getColumnName(int列){
返回标题[列];
}
@凌驾
public int getRowCount(){
退货订单.size()>20?订单.size():20;
}
@凌驾
public int getColumnCount(){
返回页眉长度;
}
@凌驾
公共类getColumnClass(int columnIndex){
System.out.println(“在getColumnClass中”);
开关(列索引)
{
案例1:返回Boolean.class;
案例2:返回Boolean.class;
默认值:返回String.class;
}
}
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
返回true;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
...
}

出于价值,我使用您的代码创建了自己的代码,但对其进行了充实,使其能够编译和运行,代码按预期工作:JCheckbox可以在您希望看到的地方看到。请您自己测试以查看:


我更改了getRowCount以反映可用Orders对象的实际数量。

问题是,我在GUI中设置了一个DefaultCellRenderer来居中:

    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );

    for(int i = 0;i<table1.getColumnCount();i++)
        table1.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
DefaultTableCellRenderer-centerRenderer=新建DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);

对于(iTi=0;您使用的是什么渲染器和编辑器?您问为什么您的代码不正确,但是您已经发布了代码,我们既不能编译,也不能运行,也不能测试。请考虑创建和发布一个有效的。我不是要求您发布整个程序,而是一个运行和演示问题的小程序,而不是什么。更多信息。@UsagiMiyamoto:我假设OP正在使用Boolean.class的默认呈现器和编辑器,因为这应该显示一个正常运行的JCheckBox,但您是对的,我看不到有足够的信息来回答这个问题。@hoverCraftfullOfels来了!getRowCount()看起来不安全。它应该返回
orders.size()
否则,如果用户试图编辑一个不存在的订单,就会有抛出NPE的风险。谢谢!我刚刚完成了我自己的示例,它也能工作…我真的不知道出了什么问题…@Asbaragus:那么你需要继续工作来隔离问题。研究你的实际代码和工作代码之间的差异。然后修改一个或多个代码我明白了…我很抱歉浪费了你的时间!这对我们来说有点令人沮丧,因为在最初的问题中,没有任何信息可以让我们在不进行胡乱猜测的情况下找出答案或提供答案。这是你应该努力提供的主要原因之一这是我的“答案”是一个社区维基答案的一个原因,因为它实际上不是一个答案,因为这个问题无法回答。但很高兴你理解我的观点。
@SuppressWarnings("serial")
class OrderTableModel extends AbstractTableModel {
    private ArrayList<Orders> orders;
    private final String[] HEADER = { "Date", "isParty", "isHost" };

    public OrderTableModel(ArrayList<Orders> orders) {
        this.orders = orders;
    }

    public OrderTableModel() {
        orders = new ArrayList<>();
    }

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

    @Override
    public int getRowCount() {
        // !! return orders.size() > 20 ? orders.size() : 20;
        return orders.size(); // !!
    }

    @Override
    public int getColumnCount() {
        return HEADER.length;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        System.out.println("in getColumnClass");
        switch (columnIndex) {
        case 1:
            return Boolean.class;
        case 2:
            return Boolean.class;
        default:
            return String.class;
        }

    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Orders order = (Orders) orders.get(rowIndex);
        switch (columnIndex) {
        case 0:
            String name = (String) aValue;
            order.setName(name);
            break;
        case 1:
            Boolean party = (Boolean) aValue;
            order.setParty(party);
        case 2:
            Boolean host = (Boolean) aValue;
            order.setHost(host);
        }
        fireTableRowsUpdated(rowIndex, rowIndex);
    }

    public void addOrders(Orders order) {
        orders.add(order);
        fireTableRowsInserted(getRowCount() - 1, getRowCount());
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Orders order = (Orders) orders.get(rowIndex);
        switch (columnIndex) {
        case 0:
            return order.getName();
        case 1:
            return order.isParty();
        case 2:
            return order.isHost();

        default:
            return null;
        }
    }
}
class Orders {
    String name;
    boolean party;
    boolean host;

    public Orders(String name, boolean party, boolean host) {
        this.name = name;
        this.party = party;
        this.host = host;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isParty() {
        return party;
    }

    public void setParty(boolean party) {
        this.party = party;
    }

    public boolean isHost() {
        return host;
    }

    public void setHost(boolean host) {
        this.host = host;
    }

}
    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );

    for(int i = 0;i<table1.getColumnCount();i++)
        table1.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);