2011-03-25 67 views
8

我正在使用JTables來顯示用戶可以過濾的信息,並且如果用戶在過濾後保存,我想將過濾的表保存到文本文件以進行持久化(這意味着任何被過濾出來的內容都不會保存到文本文件中) 。如何獲得過濾的模型?

對於過濾,我只是按照本教程的過濾部分:http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting,它工作正常,但我不確定有什麼方法可以獲取當前顯示的模型,而不是包含所有內容的底層模型沒有被過濾掉。

有沒有什麼辦法可以用我過濾的方式做到這一點?

謝謝!

回答

15

詢問表格的行數(使用getRowCount()),這將返回過濾(可見)行的數量。從0迭代到rowCount,使用convertRowIndexToModel()將每行索引轉換爲模型索引,然後向模型請求每個模型索引處的數據以構建過濾(可見)數據的列表。

0

此代碼顯示如何執行此操作。請注意,按下按鈕後,B行不會打印到輸入。

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowFilter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 
import javax.swing.JButton; 
import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class JTableFilterDemo { 
    public static void main(String[] args) { 
     Object[][] data = { { "A", 5 }, { "B", 2 }, { "C", 4 }, { "D", 8 } }; 
     String columnNames[] = { "Item", "Value" }; 
     TableModel model = new DefaultTableModel(data, columnNames) { 
      public Class<?> getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     JTable table = new JTable(model); 

     RowFilter<Object, Object> filter = new RowFilter<Object, Object>() { 
      public boolean include(Entry entry) { 
       Integer population = (Integer) entry.getValue(1); 
       return population.intValue() > 3; 
      } 
     }; 

     TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
       model); 
     sorter.setRowFilter(filter); 
     table.setRowSorter(sorter); 
     JScrollPane scrollPane = new JScrollPane(table); 
     JFrame frame = new JFrame("Filtering Table"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton btnNewButton = new JButton("Print values"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       for(int row = 0;row < table.getRowCount();row++) { 
        System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(row), 0)); 
       } 
      } 
     }); 
     frame.getContentPane().add(btnNewButton, BorderLayout.SOUTH); 
     frame.getContentPane().add(scrollPane); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
    } 
} 
+2

爲什麼劫持到另一個線程 – mKorbel 2015-03-05 13:44:28