在我的应用程序中,有一个约有200个条目的JComboBox。使用该应用程序的人抱怨说,必须一直滚动到底部是令人沮丧的,即使他们确切地知道列表的最后一个元素是什么。
所以我去了JComboBox可编辑,所以他们可以输入最后一个元素。但是,我的数据库不接受除此组合框下拉列表中的特征之外的任何值。
有没有办法只使JComboBox"可输入"而不是" editable",所以它会让你输入值,但只要它们匹配下拉列表中的至少1个项目?
修改 事实证明,上述要求的特征本身已经实现。但是,我的应用程序正在使用以某种方式禁用它的自定义代码。我无法弄清楚它发生在哪里......事实上,我根本没有看到以下代码所做的事情。
EDIT2: 我做了一些测试(花了我一些时间),并发现,我的自定义代码不是禁用该功能。事实上,组合框填充ComboBoxModel的某种错误实现阻止了跳跃。
我现在可以输入c并跳转到以c开头的第一个条目。 然而,我无法输入" " (空间),因为弹出窗口将会关闭。我找到this回答,但似乎过于复杂。难道没有更容易的方法吗?
答案 0 :(得分:0)
正如icza昨天提到的,您正在描述组合框的默认行为。以下示例完全按照您的描述(从Oracle Java教程网站获得):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ComboBoxDemo extends JPanel implements ActionListener {
public ComboBoxDemo() {
super(new BorderLayout());
String[] petStrings = { "Bird", "Cat", "Dog", "Duck", "Rabbit", "Pig" };
JComboBox<String> petList = new JComboBox<String>(petStrings);
petList.setSelectedIndex(0);
petList.addActionListener(this);
add(petList, BorderLayout.PAGE_START);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
public void actionPerformed(ActionEvent e) {
JComboBox<String> cb = (JComboBox) e.getSource();
String petName = (String) cb.getSelectedItem();
System.out.println("You selected: " + petName);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ComboBoxDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
有几个人建议您使用组合框渲染器可能有问题,我认为它们可能是正确的。无论如何,运行此示例并验证自己的行为是否符合预期。验证时,请更新此示例并使用渲染器。如果它像以前一样停止运行,那么您将确定问题所在。祝你好运。