我有一个搜索栏,当我键入一本书并单击“搜索”时,它会弹出Jlist上,但我不知道如何编写代码。任何指导表示赞赏
public void actionPerformed(ActionEvent e) {
if (e.getSource() == searchButton) {
// Action for the SEARCH button
将原始未过滤的数据保留在结构(例如ArrayList)中,并将DocumentListener
添加到搜索文本字段中,以便知道搜索文本是否已更改。然后,从removeAllElements()
的模型中过滤原始数据和JList
。最后,将过滤后的数据添加到JList
的模型中。
示例:
public class SearchInJList extends JFrame implements DocumentListener {
private static final long serialVersionUID = -1662279563193298340L;
private JList<String> list;
private List<String> data;
private DefaultListModel<String> model;
private JTextField searchField;
public SearchInJList() {
super("test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
searchField = new JTextField();
searchField.getDocument().addDocumentListener(this);
add(searchField, BorderLayout.PAGE_START);
createData();
list = new JList<>(model = new DefaultListModel<>());
data.forEach(model::addElement);
add(new JScrollPane(list), BorderLayout.CENTER);
setSize(500, 500);
setLocationByPlatform(true);
}
private void createData() {
data = new ArrayList<String>();
for (int i = 0; i < 1000; i++) {
String s = "String: " + i + ".";
data.add(s);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
SearchInJList example = new SearchInJList();
example.setVisible(true);
});
}
@Override
public void insertUpdate(DocumentEvent e) {
search();
}
@Override
public void removeUpdate(DocumentEvent e) {
search();
}
@Override
public void changedUpdate(DocumentEvent e) {
search();
}
private void search() {
List<String> filtered = data.stream().filter(s -> s.toLowerCase().contains(searchField.getText().toLowerCase()))
.collect(Collectors.toList());
model.removeAllElements();
filtered.forEach(model::addElement);
}
}
它不适用于按钮,但是我想这是您可以做的。我的意思是将search()
方法添加到按钮的动作监听器中。