Java DocumentListener上的JTable筛选器不工作 //注册过滤器 最终TableRowSorter分拣机=新的TableRowSorter(数据库模型); DocumentListener idListener=新建DocumentListener(){ public void changedUpdate(DocumentEvent DocumentEvent){ } 公共作废插入更新(DocumentEvent DocumentEvent){ 字符串searchText=txtReg.getText(); if(searchText.length()=0){ 分拣机设置行过滤器(空); }否则{ sorter.setRowFilter(RowFilter.regexFilter(searchText)); } numberOfRecords.setText(searchTable.getRowCount()+“记录”); } 公共作废移除更新(DocumentEvent DocumentEvent){ } }; txtReg.getDocument().addDocumentListener(idListener);
我又在这里问了一些可能很愚蠢的问题…:(我有一个JTable,我想在输入文本字段时过滤掉。在研究了一点之后,我想到了这个,但它不起作用!如果我把过滤器放在侦听器外面,并使用任意字符串作为搜索词,它会很好地工作。我遗漏了什么?谢谢Java DocumentListener上的JTable筛选器不工作 //注册过滤器 最终TableRowSorter分拣机=新的TableRowSorter(数据库模型); DocumentListener idListener=新建DocumentListener(){ public void changedUpdate(DocumentEvent DocumentEvent){ } 公共作废插入更新(DocumentEvent DocumentEvent){ 字符串searchText=txtReg.getText(); if(searchText.length()=0){ 分拣机设置行过滤器(空); }否则{ sorter.setRowFilter(RowFilter.regexFilter(searchText)); } numberOfRecords.setText(searchTable.getRowCount()+“记录”); } 公共作废移除更新(DocumentEvent DocumentEvent){ } }; txtReg.getDocument().addDocumentListener(idListener);,java,swing,jtable,jtextfield,rowfilter,Java,Swing,Jtable,Jtextfield,Rowfilter,我又在这里问了一些可能很愚蠢的问题…:(我有一个JTable,我想在输入文本字段时过滤掉。在研究了一点之后,我想到了这个,但它不起作用!如果我把过滤器放在侦听器外面,并使用任意字符串作为搜索词,它会很好地工作。我遗漏了什么?谢谢 //Registration filter final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel); Do
//Registration filter
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
DocumentListener idListener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {
}
public void insertUpdate(DocumentEvent documentEvent) {
String searchText = txtReg.getText();
if (searchText.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(searchText));
}
numberOfRecords.setText(searchTable.getRowCount() + " records");
}
public void removeUpdate(DocumentEvent documentEvent) {
}
};
txtReg.getDocument().addDocumentListener(idListener);
公共类GUI扩展JFrame{
私有静态最终长serialVersionUID=-7968397937566078184L;
私有静态最终JLabel numberOfRecords=新JLabel();
私有静态int numberOfRows;
私有静态DefaultTableModel数据库模型;
公共GUI(DefaultTableModel数据库){
设置DefaultLookandFeelDecorated(true);
setLayout(新的MigLayout());
databaseModel=数据库;
//菜单
JMenuBar menubar=新的JMenuBar();
JMenu文件=新JMenu(“文件”);
JMenuItem update=newjmenuItem(“查找数据库更新”);
JMenuItem设置=新的JMenuItem(“设置”);
JMenuItem退出=新的JMenuItem(“退出”);
menubar.add(文件);
文件。添加(更新);
添加(设置);
文件。添加(退出);
setJMenuBar(菜单栏);
//顶部
JPanel searchSection=新的JPanel();
searchSection.setLayout(新的MigLayout(“宽50mm!”);
最终JTextField txtReg=新的JTextField(10);
JLabel searchID=新的JLabel(“当前注册:”);
JLabel LBL制造商=新JLabel(“制造商”);
JCOMBOX CMBMacturer=新的JCOMBOX();
JLabel lblType=新的JLabel(“类型”);
JComboBox cmbType=新的JComboBox();
//构建主窗口
searchSection.add(searchID);
searchSection.add(txtReg,“span 2”);
searchSection.add(LBL制造商);
搜索部分。添加(CMB制造商,“growx,span 2”);
searchSection.add(lblType);
searchSection.add(cmbType,“growx,span 2”);
//桌子
最终JTable searchTable=新JTable(数据库模型);
//收拾桌子,还得弄清楚这张
整数宽度=0;
对于(int row=0;row
所以我最终启动了它。看起来是个简单的错误。您忘记了表的设置行排序器
public class GUI extends JFrame {
private static final long serialVersionUID = -7968397937566078184L;
private static final JLabel numberOfRecords = new JLabel();
private static int numberOfRows;
private static DefaultTableModel databaseModel;
public GUI(DefaultTableModel database){
setDefaultLookAndFeelDecorated(true);
setLayout(new MigLayout());
databaseModel = database;
//Menus
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem update = new JMenuItem("Look for database updates");
JMenuItem settings = new JMenuItem("Settings");
JMenuItem exit = new JMenuItem("Exit");
menubar.add(file);
file.add(update);
file.add(settings);
file.add(exit);
setJMenuBar(menubar);
//Top section
JPanel searchSection = new JPanel();
searchSection.setLayout(new MigLayout("w 50mm!"));
final JTextField txtReg = new JTextField(10);
JLabel searchID = new JLabel("Current registration:");
JLabel lblManufacturer = new JLabel("Manufacturer");
JComboBox cmbManufacturer = new JComboBox();
JLabel lblType = new JLabel("Type");
JComboBox cmbType = new JComboBox();
//Build main window
searchSection.add(searchID);
searchSection.add(txtReg, "span 2");
searchSection.add(lblManufacturer);
searchSection.add(cmbManufacturer, "growx, span 2");
searchSection.add(lblType);
searchSection.add(cmbType,"growx, span 2");
//Table
final JTable searchTable = new JTable(databaseModel);
//Pack table, still have to figure this one out
int width = 0;
for (int row = 0; row < searchTable.getRowCount(); row++) {
TableCellRenderer renderer = searchTable.getCellRenderer(row, 2);
Component comp = searchTable.prepareRenderer(renderer, row, 2);
width = Math.max (comp.getPreferredSize().width, width);
}
searchTable.getColumn("Key").setMaxWidth(0);
searchTable.getColumn("Key").setMinWidth(0);
searchTable.setRowSelectionAllowed(true);
searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
searchTable.setAutoCreateRowSorter(true);
searchTable.getRowSorter().toggleSortOrder(1);
searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
numberOfRows=searchTable.getRowCount();
JScrollPane browserSP = new JScrollPane(searchTable);
browserSP.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
setTitle("AirBase");
setSize(1300,700);
setMinimumSize(new Dimension(1250,650));
setExtendedState(JFrame.MAXIMIZED_BOTH);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//TODO Fill manufacturer box
//Registration filter
//TODO Fix this!
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
DocumentListener idListener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {
}
public void insertUpdate(DocumentEvent documentEvent) {
String searchText = txtReg.getText();
if (searchText.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(searchText));
}
numberOfRecords.setText(searchTable.getRowCount() + " records");
}
public void removeUpdate(DocumentEvent documentEvent) {
}
};
txtReg.getDocument().addDocumentListener(idListener);
add(searchSection, "w 100%, h 5%, wrap");
add(browserSP,"w 100%, h 95%, wrap");
numberOfRecords.setFont(numberOfRecords.getFont().deriveFont(9.0f));
numberOfRecords.setText(numberOfRows + " RECORDS");
add(numberOfRecords, "alignx center");
}
}
添加了对我有用的代码。应该对你们两个有用,给你们一个有效的TableModel
传递到GUI
。我刚刚编了一个虚拟的
注意事项:
- 您可能还需要在
DocumentListener
中将筛选代码添加到removeUpdate
中,这样当文本被退格时,它仍然会进行筛选
- 这
searchTable.getColumn(“Key”).setMaxWidth(0);
使行数据不可见。这是您真正想要的吗
- 如果希望过滤器不区分大小写,可以使用此选项
searchTable.setRowSorter(sorter);
“(?i)”
是不区分大小写的正则表达式“标志”
您所拥有的乍一看很好。您能否提供一个完整的可运行示例,其中包含表的硬编码值,以便我们进行测试。@peeskillet编辑了这个问题,这就是您想要的吗?:(我应该为我的代码感到羞耻吗?hahaKinda,但您缺少表模型的数据。实际
sorter.setRowFilter(RowFilter.regexFilter("(?i)" + searchText));