我在JTextfield上输入了一个名字,但是我的桌子没有过滤任何东西!
我的代码:
public class UserPage_Admin extends JFrame {
JTable table;
UserModel model;
public UserPage_Admin() {
model = new UserModel(...);
TableRowSorter sorter = new TableRowSorter<TableModel>(model);
table = new JTable(model);
table.setRowSorter(sorter);
add(new JScrollPane(table), BorderLayout.CENTER);
add(panelForm(), BorderLayout.PAGE_START);
RowFilter<UserModel, Object> rf = null;
try {
rf = RowFilter.regexFilter(filterTF.getText(), 0);
} catch (PatternSyntaxException pse) {
return;
}
sorter.setRowFilter(rf);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(850, 600);
setVisible(true);
}
答案 0 :(得分:8)
您正在RowFilter.regexFilter(filterTF.getText(), 0);
构造函数中调用UserPage_Admin()
。如何从filterTF读取文本。我认为您应该从分配给JButton
的动作事件监听器中调用它,在提交(单击)文本时将调用它,如下所示:
submitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = filterText.getText();
if (text.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(text, 0));
}
}
});
如果要对用户密钥类型事件使用过滤,请将key listener添加到您正在输入过滤字符串的文本字段中。
filterTxtFeild.addKeyListener(new KeyAdapter() {
public void keykeyReleased(KeyEvent evt) {
// on each key type event filter.
// put your filter code as submit button
}
});
但是,正如下面的评论中所建议的那样,要使用Swing Text Component,应该使用Document.addDocumentListener(DocumentListener)
。 Swing文本组件使用Document来表示其内容。当文档内容以任何方式更改时,都会发生文档事件。添加文档侦听器,如下所示:
filterTxtFeild.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
// put your filter code here upon data insertion
}
@Override
public void removeUpdate(DocumentEvent e)
{
//put your filter code here upon data removal
}
@Override
public void changedUpdate(DocumentEvent e) {}
});
编辑:为什么更适合使用DocumentListener?
如果我们想要验证数据源中的输入,在过滤数据时使用KeyEvent
,您会发现它不会反映用户的击键,并且输入事件会在数据处理之前发送给侦听器资源。假设当我们想要输入user name
时,有人会输入"$%^&"
这样的文本。在这样的无效输入上,即使没有对数据源进行有效更改,仍会触发KeyEvent
。但是,只有在对数据源进行了有效更改时才会通知DocumentListeners
。数据输入组件产生的事件validator
可以监听asynchronously
,DocumentListener
中的文本组件永远不应该modify the contents。如果我们这样做,该程序可能会陷入僵局。
答案 1 :(得分:1)
我在JTextfield上输入了一个名字,但是我的桌子没有过滤任何东西!
有两种方法,你没有提到预期的逻辑
从DocumentListener过滤KeyTyped(您的代码在谈论???)
从ENTER键调用
两种方式都添加到JTextField
然后还有另外两个非常重要的选项
过滤整个JTable,列和行(你的代码在谈论???)
在一个(很可能在两个或更多,从未尝试过)列
一切都取决于您的目标
使用API
答案 2 :(得分:0)
初始化后,您只是无法使用 sorter 。你应该调用 JTable.setRowSorter()。