2014-01-14 78 views
0

我有一个使用AbstractTableModel的JTable。 基本上我的程序读取一个文件夹,并将文件夹中的文件添加到表中。 我已经设置了我的数据阵列像这样:为CheckBox添加动作侦听器AbstractTableModel

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

在此先感谢你们!

+0

看看这里http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editor – keuleJ

+0

你的模型实现是无效的:它必须在更改时触发相应的事件。另外,*不要*使模型成为一个监听器(什么,无论如何?) – kleopatra

回答

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);TableModelsetValueAt()方法。我编辑了我的代码,并在模型中进行了细微的修改。另外我建议您阅读oracle tutorialJTable型号。

+0

我试过了,我已经更新了我的代码以符合你的要求。它仍然不起作用... –

+0

@BrillianceOfBen我编辑了我的答案。 – alex2410

+0

谢谢!我现在开始工作了。我错过了setValueAt()中的fireTableCellUpdated()调用。非常感谢你的协助。 –