Java 为复选框添加操作侦听器AbstractTableModel

Java 为复选框添加操作侦听器AbstractTableModel,java,swing,checkbox,jtable,actionlistener,Java,Swing,Checkbox,Jtable,Actionlistener,我有一个使用AbstractTableModel的JTable。 基本上,我的程序读取一个文件夹并将文件夹中的文件添加到表中。 我将数据数组设置为: public void buildPluginSheet(){ String[] files= Files.getAvailableFiles(); data.clear(); for(int i=0; i<files.length; i++) { Object[] tmp = {files[i

我有一个使用AbstractTableModel的JTable。 基本上,我的程序读取一个文件夹并将文件夹中的文件添加到表中。 我将数据数组设置为:

public void buildPluginSheet(){
    String[] files= Files.getAvailableFiles();
    data.clear();
    for(int i=0; i<files.length; i++)
    {
        Object[] tmp = {files[i], version, new Boolean(isAvailable(files[i]))};
        data.add(tmp);
    }       
}
这是创建我的JTable的代码:

    filesTable = new JTable(model);     
    filesTable.setRowSorter(sorter);
    filesTable.setPreferredScrollableViewportSize(new Dimension(550, 260));
    filesTable.setFillsViewportHeight(true);
    filesTable.getTableHeader().setReorderingAllowed(false);
    pluginsTable.getModel().addTableModelListener(new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent e) {
            if(true){
                System.out.println("Hello");
            }
        }
    });
我在这里和其他地方看过很多不同的解决方案,运气不好。。 我尝试了tableChanged和类似函数的不同实现。。 我该如何解决这个问题


提前谢谢各位

您需要将表更改侦听器添加到表中。查看此链接并转到“侦听数据更改”部分:

为此,您可以使用需要侦听的复选框列并触发所需事件。下面是一个简单的示例,第一列中有
JCheckBox
,侦听器:

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

public class Example extends JFrame {

    public Example() {

        List<Object[]> l = new ArrayList<Object[]>();
        l.add(new Object[]{true,1,2});
        l.add(new Object[]{true,3,4});

        MyTableModel model = new MyTableModel(new String[]{"1","2","3"},l);
        final JTable t = new JTable(model);
        t.getTableHeader().setReorderingAllowed(false);
        t.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                if(e.getColumn() == 0 && e.getFirstRow()>-1){
                    System.out.println("Row : " + e.getFirstRow() +
                            " value :" + t.getValueAt(e.getFirstRow(), e.getColumn()));
                }
            }
        });
        add(new JScrollPane(t));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        new Example();
    }

    class MyTableModel extends AbstractTableModel{

        private String[] columnNames;
        private List<Object[]> data;

        public MyTableModel(String[] columnNames, List<Object[]> data ){
            this.columnNames = columnNames;
            this.data = data;

        }

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

        @Override
        public int getRowCount() {
            return data.size();
        }
        public void setValueAt(Object value, int row, int col) {
            data.get(row)[col] = value;
            fireTableCellUpdated(row, col);
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        public Class getColumnClass(int column) {
             if(column == 0){
                 return Boolean.class;
             }
            return (getValueAt(0, column).getClass());
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data.get(row)[col];
        }
    }

}
import java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.TableModelEvent;
导入javax.swing.event.TableModelListener;
导入javax.swing.table.AbstractTableModel;
公共类示例扩展了JFrame{
公共示例(){
列表l=新的ArrayList();
l、 添加(新对象[]{true,1,2});
l、 添加(新对象[]{true,3,4});
MyTableModel模型=新的MyTableModel(新字符串[]{“1”、“2”、“3”},l);
最终JTable t=新JTable(模型);
t、 getTableHeader().setReorderingAllowed(false);
t、 getModel().addTableModelListener(新的TableModelListener()){
@凌驾
公共作废表已更改(TableModelEvent e){
如果(e.getColumn()==0&&e.getFirstRow()>-1){
System.out.println(“行:”+e.getFirstRow()+
“值:”+t.getValueAt(e.getFirstRow(),e.getColumn());
}
}
});
添加(新的JScrollPane(t));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
包装();
setVisible(真);
}
公共静态void main(字符串参数[]){
新例子();
}
类MyTableModel扩展了AbstractTableModel{
私有字符串[]列名称;
私人名单数据;
公共MyTableModel(字符串[]列名称,列表数据){
this.columnNames=columnNames;
这个数据=数据;
}
@凌驾
公共布尔值可编辑(int行,int列){
如果(列==0){
返回true;
}
返回false;
}
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
public int getRowCount(){
返回data.size();
}
public void setValueAt(对象值、整行、整列){
data.get(row)[col]=值;
FireTableCell更新(行、列);
}
@SuppressWarnings({“unchecked”,“rawtypes”})
公共类getColumnClass(int列){
如果(列==0){
返回Boolean.class;
}
返回(getValueAt(0,列).getClass());
}
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据。获取(行)[col];
}
}
}
编辑:


您需要调用
fireTableCellUpdated(行、列)setValueAt()
方法中的
表格模型中的code>。我编辑了我的代码,对你的模型做了一些小的修改。另外,我建议您阅读
JTable
model。

我已经尝试过添加一个简单的打印函数,以便知道是否正在调用它。还将侦听器添加到我的表中。。我将更新上面的代码。看看这里,您的模型实现无效:它必须在更改时触发相应的事件。另外,不要让模型成为一个监听器(到底是为了什么?),我试过了,我已经更新了上面的代码以匹配你的。。还是不行…谢谢!我现在开始工作了。我缺少setValueAt()中的fireTableCellUpdated()调用。非常感谢你的帮助。
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

public class Example extends JFrame {

    public Example() {

        List<Object[]> l = new ArrayList<Object[]>();
        l.add(new Object[]{true,1,2});
        l.add(new Object[]{true,3,4});

        MyTableModel model = new MyTableModel(new String[]{"1","2","3"},l);
        final JTable t = new JTable(model);
        t.getTableHeader().setReorderingAllowed(false);
        t.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                if(e.getColumn() == 0 && e.getFirstRow()>-1){
                    System.out.println("Row : " + e.getFirstRow() +
                            " value :" + t.getValueAt(e.getFirstRow(), e.getColumn()));
                }
            }
        });
        add(new JScrollPane(t));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        new Example();
    }

    class MyTableModel extends AbstractTableModel{

        private String[] columnNames;
        private List<Object[]> data;

        public MyTableModel(String[] columnNames, List<Object[]> data ){
            this.columnNames = columnNames;
            this.data = data;

        }

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

        @Override
        public int getRowCount() {
            return data.size();
        }
        public void setValueAt(Object value, int row, int col) {
            data.get(row)[col] = value;
            fireTableCellUpdated(row, col);
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        public Class getColumnClass(int column) {
             if(column == 0){
                 return Boolean.class;
             }
            return (getValueAt(0, column).getClass());
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data.get(row)[col];
        }
    }

}