Java:单击另一个复选框时自动更新JTable中的复选框

Java:单击另一个复选框时自动更新JTable中的复选框,java,swing,jtable,Java,Swing,Jtable,我希望在单击EventYearMatchingUnitPanel类中JTable中的复选框时,自动选中EventYearMatching窗口中JTable中的每个复选框 单击第一张图片()中的“unit 9”复选框应自动选中第二张图片()中的所有5个复选框 我使用TabelModelListener中的tableChanged()方法来检测是否单击了复选框。单击复选框时,它会更改其他复选框的值(从Boolean.FALSE更改为Boolean.TRUE),但复选框不会更新(不会实际显示复选标记)

我希望在单击EventYearMatchingUnitPanel类中JTable中的复选框时,自动选中EventYearMatching窗口中JTable中的每个复选框

单击第一张图片()中的“unit 9”复选框应自动选中第二张图片()中的所有5个复选框

我使用TabelModelListener中的tableChanged()方法来检测是否单击了复选框。单击复选框时,它会更改其他复选框的值(从Boolean.FALSE更改为Boolean.TRUE),但复选框不会更新(不会实际显示复选标记)

//对于第一个JTable
公共作废表已更改(TableModelEvent e){
int row=e.getFirstRow();
int column=e.getColumn();
TableModel模型=(TableModel)e.getSource();
字符串columnName=model.getColumnName(列);
对象thatValue=model.getValueAt(行、列);
数据[行][列]=该值;
对于(int i=0;i
下面是代码的大图:

public class EventYearMatchingWindow extends JFrame implements 
TableModelListener
{
    private boolean columnHeaderClicked;
    private ArrayList<Category> categories;
    private JPanel mainPanel, listPanel, buttonPanel;
    private ArrayList<Item> selectedItems;
    private EventYearMatchingItemChoosing[] unitPanels;
    Object data[][];
    public EventYearMatchingWindow(ArrayList<Category> c){
        ...
        String[] columnNames = {"Include?", ""};   
        data = new Object[6][2];
        for(int i = 0; i < 6; i++){
            data[i][0] = Boolean.FALSE;
            data[i][1] = "Unit " + (i+8);
        }
        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 1L;
            @Override
            public Class getColumnClass(int columnIndex) {
                if (columnIndex == 0){
                    return Boolean.class;
                }
                return super.getColumnClass(columnIndex);
            }
        };

        JTable table = new JTable(model);
        table.getModel().addTableModelListener(this);
        table.addMouseListener(new java.awt.event.MouseAdapter() {
        ....
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                int row = table.rowAtPoint(evt.getPoint());
                int col = table.columnAtPoint(evt.getPoint());
                if (row == -1 && col >= 0){
                    columnHeaderClicked = true;
                }
                if (row >= 0 && col == 1 && !columnHeaderClicked) {
                    mainPanel.removeAll();

                    System.out.println(unitPanels[row].getData()[0][0]);
                    unitPanels[row].revalidate();
                    unitPanels[row].repaint();

                    mainPanel.add(unitPanels[row]);
                    JPanel nButtonPanel = new JPanel();
                    Button back = new Button("Back");
                    nButtonPanel.add(back);
                    back.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            mainPanel.removeAll();
                            mainPanel.add(listPanel);
                            mainPanel.add(buttonPanel);
                            mainPanel.revalidate();
                            repaint();
                        }
                    });
                    mainPanel.add(nButtonPanel);
                    mainPanel.revalidate();
                    repaint();
                }
            }
        });   
    }
    public void tableChanged(TableModelEvent e){
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object thatValue = model.getValueAt(row, column);
        data[row][column] = thatValue;
        for(int i = 0; i < unitPanels[row].getNumRows(); i++){
            unitPanels[row].setToSelectedState(i);
        }
    } 
}
公共类EventYearMatchingWindow扩展JFrame实现
TableModelListener
{
私有布尔列标题被单击;
私有数组列表类别;
专用JPanel主面板、列表面板、按钮面板;
私有数组列表selectedItems;
private EventYearMatching Item选择[]单元面板;
对象数据[];
公共事件年度匹配窗口(ArrayList c){
...
字符串[]columnNames={“包括?”,“”};
数据=新对象[6][2];
对于(int i=0;i<6;i++){
数据[i][0]=Boolean.FALSE;
数据[i][1]=“单位”+(i+8);
}
DefaultTableModel=新的DefaultTableModel(数据、列名){
私有静态最终长serialVersionUID=1L;
@凌驾
公共类getColumnClass(int columnIndex){
如果(columnIndex==0){
返回Boolean.class;
}
返回super.getColumnClass(columnIndex);
}
};
JTable table=新的JTable(模型);
table.getModel().addTableModelListener(此);
table.addMouseListener(新java.awt.event.MouseAdapter(){
....
@凌驾
public void mouseClicked(java.awt.event.MouseEvent evt){
int row=table.rowAtPoint(evt.getPoint());
int col=table.columnAtPoint(evt.getPoint());
如果(行==-1&&col>=0){
columnHeaderClicked=true;
}
如果(行>=0&&col==1&&columnHeaderClicked){
mainPanel.removeAll();
System.out.println(unitPanels[row].getData()[0][0]);
unitPanels[row]。重新验证();
unitPanels[row]。重新绘制();
主面板。添加(单元面板[行]);
JPanel nButtonPanel=新的JPanel();
按钮后退=新按钮(“后退”);
nButtonPanel.add(返回);
back.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
mainPanel.removeAll();
添加(列表面板);
主面板。添加(按钮面板);
mainPanel.revalidate();
重新油漆();
}
});
主面板。添加(nButtonPanel);
mainPanel.revalidate();
重新油漆();
}
}
});   
}
公共作废表已更改(TableModelEvent e){
int row=e.getFirstRow();
int column=e.getColumn();
TableModel模型=(TableModel)e.getSource();
字符串columnName=model.getColumnName(列);
对象thatValue=model.getValueAt(行、列);
数据[行][列]=该值;
对于(int i=0;i
以及:

公共类EventYearMatchingItemSelecting扩展了JPanel实现TableModelListener
{
类别;
私有布尔列标题被单击;
私有整数大小;
私有ArrayList项;
私有对象[][]数据;
默认表格模型;
public EventYearMatchingItemSelecting(字符串s,数组列表c){
...
String[]columnNames={“包括?”,“事件”,“年份”};
数据=新对象[大小][3]
对于(inti=0;ipublic class EventYearMatchingWindow extends JFrame implements 
TableModelListener
{
    private boolean columnHeaderClicked;
    private ArrayList<Category> categories;
    private JPanel mainPanel, listPanel, buttonPanel;
    private ArrayList<Item> selectedItems;
    private EventYearMatchingItemChoosing[] unitPanels;
    Object data[][];
    public EventYearMatchingWindow(ArrayList<Category> c){
        ...
        String[] columnNames = {"Include?", ""};   
        data = new Object[6][2];
        for(int i = 0; i < 6; i++){
            data[i][0] = Boolean.FALSE;
            data[i][1] = "Unit " + (i+8);
        }
        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 1L;
            @Override
            public Class getColumnClass(int columnIndex) {
                if (columnIndex == 0){
                    return Boolean.class;
                }
                return super.getColumnClass(columnIndex);
            }
        };

        JTable table = new JTable(model);
        table.getModel().addTableModelListener(this);
        table.addMouseListener(new java.awt.event.MouseAdapter() {
        ....
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                int row = table.rowAtPoint(evt.getPoint());
                int col = table.columnAtPoint(evt.getPoint());
                if (row == -1 && col >= 0){
                    columnHeaderClicked = true;
                }
                if (row >= 0 && col == 1 && !columnHeaderClicked) {
                    mainPanel.removeAll();

                    System.out.println(unitPanels[row].getData()[0][0]);
                    unitPanels[row].revalidate();
                    unitPanels[row].repaint();

                    mainPanel.add(unitPanels[row]);
                    JPanel nButtonPanel = new JPanel();
                    Button back = new Button("Back");
                    nButtonPanel.add(back);
                    back.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            mainPanel.removeAll();
                            mainPanel.add(listPanel);
                            mainPanel.add(buttonPanel);
                            mainPanel.revalidate();
                            repaint();
                        }
                    });
                    mainPanel.add(nButtonPanel);
                    mainPanel.revalidate();
                    repaint();
                }
            }
        });   
    }
    public void tableChanged(TableModelEvent e){
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object thatValue = model.getValueAt(row, column);
        data[row][column] = thatValue;
        for(int i = 0; i < unitPanels[row].getNumRows(); i++){
            unitPanels[row].setToSelectedState(i);
        }
    } 
}
public class EventYearMatchingItemChoosing extends JPanel implements TableModelListener
{
    Category category;
    private boolean columnHeaderClicked;
    private int size;
    private ArrayList<Item> items;
    private Object[][] data;
    DefaultTableModel model;
    public EventYearMatchingItemChoosing(String s, ArrayList<Category> c){
        ...
        String[] columnNames = {"Include?", "Event", "Year"};   
        data = new Object[size][3]
        for(int i = 0; i < category.getItems().size(); i++){ 
            if(!category.getItems().get(i).getEvent().equals("") && !category.getItems().get(i).getYear().equals("")){
                data[i][0] = Boolean.FALSE;
                data[i][1] = category.getItems().get(i).getEvent();            
                data[i][2] = category.getItems().get(i).getYear();   
            }
        }    

        model = new DefaultTableModel(data, columnNames) {   
            private static final long serialVersionUID = 1L;   
            @Override
            public Class getColumnClass(int columnIndex) {
                if (columnIndex == 0){
                    return Boolean.class;
                }
                return super.getColumnClass(columnIndex);
            }    
        };
        JTable table = new JTable(model);
        table.getModel().addTableModelListener(this);
        ...
    }
    ...
    public void tableChanged(TableModelEvent e){
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object thatValue = model.getValueAt(row, column);
        data[row][column] = thatValue;
    }
    public void setToSelectedState(int row){    
        data[row][0] = Boolean.TRUE;
        model.fireTableCellUpdated(row, 0);
    }
}
data[row][0] = Boolean.TRUE;
model.setValueAt(Boolean.TRUE, row, 0);