【问题标题】:Add Action Listeners AbstractTableModel for checkBox为复选框添加动作侦听器 AbstractTableModel
【发布时间】:2014-01-15 15:01:39
【问题描述】:

我有一个使用 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

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

我的 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 和类似功能的不同实现.. 我该如何解决这个问题?

提前谢谢大家!

【问题讨论】:

标签: java swing checkbox jtable actionlistener


【解决方案1】:

为此,您可以使用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];
        }
    }

}

编辑:

您需要在TableModel 中的setValueAt() 方法中调用fireTableCellUpdated(row, col);。我编辑了我的代码,在您的模型中进行了微小的更改,以检查这一点。我还建议您阅读oracle tutorial 以了解JTable 模型。

【讨论】:

  • 我试过了,我已经更新了我上面的代码以匹配你的..它仍然不起作用......
  • 谢谢!我现在开始工作了。我错过了 setValueAt() 中的 fireTableCellUpdated() 调用。非常感谢您的帮助。
【解决方案2】:

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

【讨论】:

  • 我尝试过添加一个简单的打印函数,这样我就知道它是否被调用了。还将侦听器添加到我的表中。我将更新上面的代码。
猜你喜欢
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2021-10-15
  • 2018-07-13
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多