2012-03-30 66 views
3

我想为所有列添加过滤/搜索功能(以便它是通用的),逻辑不是问题。不过,我在想,在可视化方面做到这一点的最佳方式是在每个列标题(或列标题的一部分)上方都有一个文本字段?Swing JTable定制过滤/搜索

  1. 列标题要求中嵌入实施新的渲染+有,不知怎的,我需要捕捉,因为电池的情况下问题:

    当试图做到这一点我碰到的几个问题被绘制并且不响应事件。看起来对我来说是一种矫枉过正。

  2. 在每列上方有一个单独的文本字段组件行(面板)乍一看听起来容易得多,但是,将文本字段与列对齐是有问题的,因为我在JTableTableColumn中找不到API,列的坐标。此外,移动列将意味着调整文本字段(这是可能的,但另一个开销)。

我是否错过了一些东西,或者确实很难实现那样简单的事情?还有其他建议吗?

回答

3

没有为你的第一种方法库。它可以很容易地集成和真正伟大的作品:Swing Bits

+0

新地址:http://github.com/eugener/oxbow – 2014-03-19 20:02:02

+1

这里还有一个不错的图书馆:http://coderazzi.net/tablefilter/ – 2014-03-19 20:56:41

0

见下文的样品过滤依靠过滤您的JTable数据 文本字段项依靠文本框中输入:

import java.awt.BorderLayout; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

公共类TestTableSorterFilter扩展JApplet的{

private String[] columnNames 
     = {"Country", "Capital", "Population in Millions", "Democracy"}; 

private Object[][] data = { 
    {"USA", "Washington DC", 280, true}, 
    {"Canada", "Ottawa", 32, true}, 
    {"United Kingdom", "London", 60, true}, 
    {"Germany", "Berlin", 83, true}, 
    {"France", "Paris", 60, true}, 
    {"Norway", "Oslo", 4.5, true}, 
    {"India", "New Delhi", 1046, true} 
}; 

private JTable jTable = new JTable(data, columnNames); 

private TableRowSorter<TableModel> rowSorter 
     = new TableRowSorter<>(jTable.getModel()); 

private JTextField jtfFilter = new JTextField(); 
private JButton jbtFilter = new JButton("Filter"); 

public TestTableSorterFilter() { 
    jTable.setRowSorter(rowSorter); 

    JPanel panel = new JPanel(new BorderLayout()); 
    panel.add(new JLabel("Specify a word to match:"), 
      BorderLayout.WEST); 
    panel.add(jtfFilter, BorderLayout.CENTER); 

    add(panel, BorderLayout.SOUTH); 
    add(new JScrollPane(jTable), BorderLayout.CENTER); 

    jtfFilter.getDocument().addDocumentListener(new DocumentListener(){ 

     @Override 
     public void changedUpdate(DocumentEvent arg0) {} 

     @Override 
     public void insertUpdate(DocumentEvent arg0) { 
      String text = jtfFilter.getText(); 

      if (text.trim().length() == 0) { 
       rowSorter.setRowFilter(null); 
      } else { 
       rowSorter.setRowFilter(RowFilter.regexFilter(text)); 
      } 
     } 

     @Override 
     public void removeUpdate(DocumentEvent arg0) { 
      String text = jtfFilter.getText(); 
      if (text.trim().length() == 0) { 
       rowSorter.setRowFilter(null); 
      } else { 
       rowSorter.setRowFilter(RowFilter.regexFilter(text)); 
      } 
     } 
    }); 
} 
}