为checkBox添加动作侦听器AbstractTableModel

时间:2014-01-14 00:12:01

标签: 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], version, new Boolean(isAvailable(files[i]))};
        data.add(tmp);
    }       
}

数据类型为ArrayList&lt;对象[] []&gt;

如果表中有布尔值,它就像一个复选框一样吗?我需要的是能够在选中复选框时执行一个功能,而在未选中时执行另一个功能。此外,我必须能够传递复选框所在的行,以便我可以获得与复选框关联的文件名。

我的AbstractTableModel如下所示:

class MyTableModel extends AbstractTableModel{
    private static final long serialVersionUID = 4567658160237952337L;

    @Override 
    public boolean isCellEditable(int row, int col){
        if(col == 2){
            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;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Class getColumnClass(int column) {
        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];
    }
}

这是我创建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和类似函数的不同实现。 我该如何解决这个问题?

先谢谢你们!

2 个答案:

答案 0 :(得分:0)

您需要将Table Changed侦听器添加到表中。请查看此链接,然后转到“收听数据更改”部分: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

答案 1 :(得分:0)

为此,您可以使用TableModelListener来监听复选框列并触发所需的事件。以下是第一列中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];
        }
    }

}

编辑:

您需要使用fireTableCellUpdated(row, col);方法在TableModel中致电setValueAt()。我编辑了我的代码,模型中的细微变化检查了它。另外,我建议您阅读JTable模型的oracle tutorial