gpt4 book ai didi

java - java 中的 jcombobox 过滤器 - 外观独立

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:03 26 4
gpt4 key购买 nike

我有一个像这样的简单 JComboBox 过滤器代码:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class FilterComboBox extends JComboBox {
private List<String> array;

public FilterComboBox(List<String> array) {
super(array.toArray());
this.array = array;
this.setEditable(true);
final JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
textfield.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
comboFilter(textfield.getText());
}
});
}
});

}

public void comboFilter(String enteredText) {
List<String> filterArray= new ArrayList<String>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
filterArray.add(array.get(i));
}
}
if (filterArray.size() > 0) {
this.setModel(new DefaultComboBoxModel(filterArray.toArray()));
this.setSelectedItem(enteredText);
this.showPopup();
}
else {
this.hidePopup();
}
}

/* Testing Codes */
public static List<String> populateArray() {
List<String> test = new ArrayList<String>();
test.add("");
test.add("Mountain Flight");
test.add("Mount Climbing");
test.add("Trekking");
test.add("Rafting");
test.add("Jungle Safari");
test.add("Bungie Jumping");
test.add("Para Gliding");
return test;
}

public static void makeUI() {
JFrame frame = new JFrame("Adventure in Nepal - Combo Filter Test");
FilterComboBox acb = new FilterComboBox(populateArray());
frame.getContentPane().add(acb);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

public static void main(String[] args) throws Exception {

//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
makeUI();
}
}

combo filter 的性能不是很好,但是对于少数数据集来说还可以。我的问题是 - 当我删除注释 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 以更改外观时,过滤器不起作用。在 WindowsLookAndFeel 中,组合框仅通过替换先前输入的字符来获取其中的单个字符。

Different Outputs after typing 'moun'

你能告诉我发生了什么事吗? Manoj Shrestha's answer below在某种程度上有所帮助,但是,您能否提供一些其他建议以在 Java 中实现组合框过滤器?

最佳答案

首先,您每次都在创建新模型,然后从导致闪烁等的代码中调用显示弹出窗口。我们可以修改模型本身。其次,您将当前输入的文本设置为所选项目,这似乎具有其他人指出的 selectAll 行为。我修改了代码如下:

public void comboFilter(String enteredText) {
if (!this.isPopupVisible()) {
this.showPopup();
}

List<String> filterArray= new ArrayList<String>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
filterArray.add(array.get(i));
}
}
if (filterArray.size() > 0) {
DefaultComboBoxModel model = (DefaultComboBoxModel) this.getModel();
model.removeAllElements();
for (String s: filterArray)
model.addElement(s);

JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
textfield.setText(enteredText);
}
}

希望它对你有用。

关于java - java 中的 jcombobox 过滤器 - 外观独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com