Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能通过单击更改JTable中的布尔值_Java_Swing_Jtable_Jcheckbox_Jcolorchooser - Fatal编程技术网

Java 为什么我不能通过单击更改JTable中的布尔值

Java 为什么我不能通过单击更改JTable中的布尔值,java,swing,jtable,jcheckbox,jcolorchooser,Java,Swing,Jtable,Jcheckbox,Jcolorchooser,我已经创建了自己的JTable我希望它包含: JLabel,JColorChooser,JCheckBox按此顺序排列在每一列中,但我不知道如何将它们添加到我的JPanel中。此外,我在第3节中添加了Booleans,它们在表中显示为复选框,当我单击它们时,它们不会进行编辑(false->true,true->false)。我将我的所有单元格设置为可编辑 我有一张表格: import javax.swing.JTable; import javax.swing.table.TableModel;

我已经创建了自己的
JTable
我希望它包含:

JLabel
JColorChooser
JCheckBox
按此顺序排列在每一列中,但我不知道如何将它们添加到我的JPanel中。此外,我在第3节中添加了
Booleans
,它们在表中显示为复选框,当我单击它们时,它们不会进行编辑(false->true,true->false)。我将我的所有单元格设置为可编辑

我有一张表格:

import javax.swing.JTable;
import javax.swing.table.TableModel;


public class MyJTab extends JTable {
        public MyJTab(TableModel model) {
            super(model);       
        }
}
模型:

import java.util.ArrayList;

import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JLabel;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;


public class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {"ksztalt", "kolor", "stan watku"};
    private ArrayList<RowModel> data;

    public MyTableModel() {
        data = new ArrayList<RowModel>();

    }

    public void addRow(RowModel row){
        data.add(row);
    }
    @Override
    public Class<?> getColumnClass(int columnIndex) {

    /*  return data.get(0).getElement(columnIndex).getClass();*/
        if(columnIndex == 0)
            return JLabel.class;
        if(columnIndex == 1)
            return  JColorChooser.class;
        if(columnIndex == 2)
            return Boolean.class;
        return null;
    }

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

    @Override
    public String getColumnName(int columnIndex) {
        return columnNames[columnIndex];
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
          return data.get(rowIndex).getElement(columnIndex);
    }

    @Override
    public void setValueAt(Object val, int row, int col) {      
          data.get(row).setValue(col, val);
          fireTableCellUpdated(row, col);   
    }

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

首先,您的
RowModel
方法的
setValue
没有任何作用,因此它没有记录任何更改,因此值永远不会更改。对于
JColorChoorser
,也没有默认的单元格渲染器/编辑器,因此您必须自己提供这两种实现。在我看来,每一行都有一个颜色选择器似乎很奇怪。相反,我可能需要维护一个
颜色
,不要在模型中存储JLabel。存储要显示的图标。JTable提供了默认情况下在JLabel上显示图标的支持。
And the row Model:

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JLabel;


public class RowModel {
Przesuwacz p;
JLabel iconLabel;
JColorChooser colorChooser;
Boolean isMoving;

private final static int ICON_LABEL = 0, COLOR_CHOOSER = 1, CHECK_BOX = 2;
    public RowModel(Przesuwacz p) {
        this.p = p;
        isMoving = new Boolean(true);
        ImageIcon icon =  new ImageIcon(p.getF().getClass().getName().toLowerCase() +".jpg");
        iconLabel = new JLabel();
        iconLabel.setIcon(icon);

    }
    public Object getElement(int columnIndex) {
        if(columnIndex == ICON_LABEL)
            return iconLabel;
        if(columnIndex == COLOR_CHOOSER)
            return colorChooser;
        if(columnIndex == CHECK_BOX)
            return isMoving;
        return null;
    }

    public void setValue(int col, Object val) {

    }

}