2014-01-14 80 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()調用。非常感謝你的協助。 –