2014-01-14 2 views
0

У меня есть JTable с использованием AbstractTableModel. В основном моя программа читает папку и добавляет файлы в папку в таблицу. Я настроил свой массив данных, как так:Добавить исполнителей для прослушивания AbstractTableModel для checkBox

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 < Object [] []>

Если у вас есть логическое значение в таблице он действует как флажок правильно? Мне нужно, чтобы иметь возможность выполнять функцию, когда флажок установлен, а другой - при снятии флажка. Кроме того, я должен иметь возможность передать, какая строка была в этом флажке, поэтому я могу получить имя файла, связанное с этим флажком.

Мой 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]; 
     } 
    } 

} 

EDIT:

Вы должны вызвать fireTableCellUpdated(row, col); в методе TableModel в setValueAt(). Я редактировал мой код с незначительными изменениями в вашей модели. Также я рекомендую вам прочитать oracle tutorial для модели JTable.

+0

Я пробовал это, и я обновил свой код выше, чтобы соответствовать вашим. Он по-прежнему не работает ... –

+0

@BrillianceOfBen Я отредактировал свой ответ. – alex2410

+0

Спасибо! Теперь мне нужно работать. Мне не удалось вызвать вызов fireTableCellUpdated() внутри setValueAt(). Большое спасибо за вашу помощь. –

0

Вам нужно добавить прослушиватель таблицы Changed в таблицу. Посмотрите на эту ссылку и перейдите в раздел «Прослушивание изменений данных»: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

+0

Я пробовал, добавляя простую функцию печати, поэтому я буду знать, будет ли она вызвана. Также добавление слушателя к моей таблице. Я обновлю код выше. –

Смежные вопросы