2012-03-30 5 views
3

Я хотел бы добавить возможность фильтрации/поиска для всех столбцов (так что это общий), логика не является проблемой. Однако я думал, что лучший способ сделать это с точки зрения визуализации - иметь текстовое поле над каждым заголовком столбца (или частью заголовка столбца)?Настройка Swing JTable для фильтрации/поиска

Я столкнулся несколько проблем при попытке достичь этого:

  1. Встраивание в пределах требований заголовков столбцов, реализующая новый визуализатор + есть проблема, что-то мне нужно, чтобы поймать событие, потому что клетки рисуется и не реагирует на события. Похож на меня.
  2. Наличие отдельной строки (панели) компонентов текстового поля над каждым столбцом звучит намного проще с первого взгляда, однако выравнивание текстового поля с столбцами проблематично, так как я не нашел API в JTable или TableColumn, который возвращает координаты столбца. Более того, перемещение столбца будет означать также настройку текстовых полей (что возможно, но еще одно накладное).

Я что-то упустил или это действительно так сложно достичь чего-то такого простого? Любые другие предложения?

ответ

3

Существует библиотека для первого подхода. Он может быть легко интегрирован и работает очень здорово: Swing Bits

+0

Новый адрес: http://github.com/eugener/oxbow –

+1

А вот еще одна хорошая библиотека: http://coderazzi.net/tablefilter/ –

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)); 
      } 
     } 
    }); 
} 
}