过滤从文本字段中输入
问题描述:
我有一个文本字段棍子jList1,我需要 过滤器的JList实体依赖于用户在文本框中 进入如下图所示的值如果j值列表{"one","two","three"......etc }
如果用户输入“一个JList三个“来弹出列表,并选择具有三个值 的行到选定的相关索引。过滤从文本字段中输入
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);
}
答
那么您可以创建方法通过使用
一般用数据或使用模型组件打交道时,我们应该与模型进行交互而不是组件。所以,你可以有一个方法类似
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();
}
});
}
}
UPDATE:作为mKorbel指出明显,这可能是更好的用例与单个列,其中排序和过滤一个JTable
是已经部分API。
+1好像作为JTable中有一列,无JTableHeader上仍然是更好的选择 – mKorbel 2014-10-09 07:11:26
@mKorbel :-D当然,我在想什么! – 2014-10-09 07:12:35
谢谢你很多Peeskillet我会检查和恢复 – 2014-10-09 14:23:46