我有一个文本字段坚持jList1,我需要
过滤器j列表实体取决于用户在文本框中输入的值
如下j列表值{"one","two","three"......etc }
如果用户输入"三"在文本框中弹出列表并选择具有三个值的行
选择相关指数。
private void jTbandnoActionPerformed(java.awt.event.ActionEvent evt)
{
// TODO add your handling code here:
String tXT=jTbandno.getText();
jList2.collections.equal(tXt);
int index = jList2.getSelectedIndex();
JOptionPane.showMessageDialog(null, index);
}
答案 0 :(得分:13)
您可以创建使用
过滤掉值的方法通常在处理使用模型的数据或组件时,我们应该与模型而不是组件进行交互。所以你可以有类似
的方法private String[] defaultValues = {
"a", "ab", "abc", "abcd", "abcde", "abcdef", "absdefg", "abcdefgh",
"abcdefghi", "abcdefghij", "abcdefghijk", "abcdefghijkl", "abcdefghijklm",
};
public void filterModel(DefaultListModel<String> model, String filter) {
for (String s : defaultValues) {
if (!s.startsWith(filter)) {
if (model.contains(s)) {
model.removeElement(s);
}
} else {
if (!model.contains(s)) {
model.addElement(s);
}
}
}
}
当您需要过滤时,例如在文本字段的DocumentListener
中,只需获取文本字段的文本,然后调用此方法,传入模型和过滤字符串。像
private void filter() {
String filter = field.getText();
filterModel((DefaultListModel<String>)jList.getModel(), filter);
}
这是一个完整的例子。您可能希望实现一些更复杂的过滤,例如包括排序到搜索过滤器。这只是一个简单的案例。
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class DynamicListDemo {
private String[] defaultValues = {
"a", "ab", "abc", "abcd", "abcde", "abcdef", "absdefg", "abcdefgh",
"abcdefghi", "abcdefghij", "abcdefghijk", "abcdefghijkl", "abcdefghijklm",
};
private JList jList = createJList();
public DynamicListDemo() {
JFrame frame = new JFrame();
frame.add(new JScrollPane(jList));
frame.add(createTextField(), BorderLayout.PAGE_END);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JTextField createTextField() {
final JTextField field = new JTextField(15);
field.getDocument().addDocumentListener(new DocumentListener(){
@Override public void insertUpdate(DocumentEvent e) { filter(); }
@Override public void removeUpdate(DocumentEvent e) { filter(); }
@Override public void changedUpdate(DocumentEvent e) {}
private void filter() {
String filter = field.getText();
filterModel((DefaultListModel<String>)jList.getModel(), filter);
}
});
return field;
}
private JList createJList() {
JList list = new JList(createDefaultListModel());
list.setVisibleRowCount(6);
return list;
}
private ListModel<String> createDefaultListModel() {
DefaultListModel<String> model = new DefaultListModel<>();
for (String s : defaultValues) {
model.addElement(s);
}
return model;
}
public void filterModel(DefaultListModel<String> model, String filter) {
for (String s : defaultValues) {
if (!s.startsWith(filter)) {
if (model.contains(s)) {
model.removeElement(s);
}
} else {
if (!model.contains(s)) {
model.addElement(s);
}
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new DynamicListDemo();
}
});
}
}
更新:正如mKorbel明确指出的那样,对于具有单个列的JTable
,这可能是一个更好的用例,其中排序和过滤已经是API的一部分。