【问题标题】:TableModel Change the value of a jcheckbox cell after a second click in other checkboxTableModel 在第二次单击其他复选框后更改 jcheckbox 单元格的值
【发布时间】:2013-10-04 03:29:37
【问题描述】:

我有一个带有复选框列的表格,我可以按照我想要的方式显示表格,并且我可以只编辑放置复选框的列。问题是当我选择复选框时,以正确的方式渲染该复选框,但 tablemodel 中的值没有改变,这个值只是改变,直到我点击另一个复选框,总是我选择的最后一个复选框没有反映了他在 TableModel 中的价值。我正在使用的类是:

检查单元

class CheckCell extends DefaultCellEditor implements TableCellRenderer{

    private JComponent component = new JCheckBox();    
    private boolean value = false;

    public CheckCell() {
        super(new JCheckBox());
    }


    @Override
    public Object getCellEditorValue() {
        return ((JCheckBox)component).isSelected();        
    }


    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

        ( (JCheckBox) component).setBackground( new Color(200,200,0) );

        boolean b = ((Boolean) value).booleanValue();
        ( (JCheckBox) component).setSelected( b );
        ( (JCheckBox) component).setHorizontalAlignment(SwingConstants.CENTER); 
        return ( (JCheckBox) component);     
    }


    @Override
    public boolean stopCellEditing() {        
        value = ((Boolean)getCellEditorValue()).booleanValue() ;
        ((JCheckBox)component).setSelected( value );
        return super.stopCellEditing();
    }


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (value == null)
            return null;         
         return ( (JCheckBox) component );
    }

}

检查渲染

class CheckRender extends JCheckBox implements TableCellRenderer {

    private JComponent component = new JCheckBox();


    public CheckRender() {
        setOpaque(true);
    }


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

       ((JCheckBox) component).setBackground( new Color(0,200,0));

       boolean b = ((Boolean) value).booleanValue();
       ((JCheckBox) component).setSelected(b);
       ((JCheckBox) component).setHorizontalAlignment(SwingConstants.CENTER); 
       return ((JCheckBox) component);  
    }

}

我的模型

class DynaTableModel extends DefaultTableModel {

    public DynaTableModel() {
        super();
    }

    public DynaTableModel(final DynaTableBean dynaBean) {
        super(dynaBean.getContent(), dynaBean.getHeaders());
    }    

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col == 0)    
        {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int column) {
        super.setValueAt(value, row, column);
    }

你能帮我解决这个问题吗?当复选框发生更改时,我缺少什么来更改 jtable 中的值。

我是 Java 新手,我认为我缺少一些东西。 提前致谢。


更明确一点,当我勾选复选框并尝试从 TableModel 恢复值时,如果我勾选第一个复选框并尝试使用以下方法恢复值,则该值是错误的:

valor = (Boolean) tablemodel.getValueAt(i, 0);

当这应该为真时,我得到了错误,但是如果我检查第一个复选框,然后检查第二个复选框,那么第一个复选框的值现在很好(真)但第二个仍然是错误是一种错误,但我找不到避免这种情况的方法。

有人知道如何避免这种情况。

【问题讨论】:

  • 不要重新发明轮子,结果往往是三角形;-) 或者换句话说:您的编辑器实现无效。并且默认支持布尔值的复选框编辑器......只需学习正确使用它们

标签: java swing checkbox jtable boolean


【解决方案1】:

我有一个带有复选框列的表格,我可以显示该表格 就像我想要的那样,我只编辑复选框所在的列 放置。问题是当我选择渲染油漆的复选框时 复选框的正确方式,但表模型中的值不是 改变了,这个值只是改变,直到我点击另一个 复选框,总是我选择的最后一个复选框不反映他的 TableModel 中的值

  • JTable 已内置支持 JCheckBox 为 TableCellRendererEditor

  • Boolean 值在XxxTableModel 中表示JCheckBox,您需要将truefalse 放在那里(第一列)

  • 覆盖public Class getColumnClass(int c) {

【讨论】:

  • 我已经将一个值为 false 的向量传递给第一列并且工作正常,当我选择任何复选框时出现问题,tablemodel 识别(更新)此更改,直到我选择另一个复选框,所以第一个在 tablemodel 中发生了变化,但我选择的最后一个仍然具有相同的值。
  • @user2824421:另见answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多