Настройка Swing JTable для фильтрации / поиска - PullRequest
3 голосов
/ 30 марта 2012

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Есть библиотека для вашего первого подхода.Он легко интегрируется и отлично работает: Swing Bits

2 голосов
/ 30 марта 2012
of visualization is having a textfield above each column header 
(or part of the column header)... 
0 голосов
/ 26 октября 2014

Ниже приведен пример фильтрации, основанной на записях текстового поля, фильтрующих данные 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));
            }   
        }
    });
}
}
...