JComboBox:不可编辑但可输入

时间:2014-10-15 13:51:20

标签: java swing jcombobox

在我的应用程序中,有一个约有200个条目的JComboBox。使用该应用程序的人抱怨说,必须一直滚动到底部是令人沮丧的,即使他们确切地知道列表的最后一个元素是什么。

所以我去了JComboBox可编辑,所以他们可以输入最后一个元素。但是,我的数据库不接受除此组合框下拉列表中的特征之外的任何值。

有没有办法只使JComboBox"可输入"而不是" editable",所以它会让你输入值,但只要它们匹配下拉列表中的至少1个项目?

修改 事实证明,上述要求的特征本身已经实现。但是,我的应用程序正在使用以某种方式禁用它的自定义代码。我无法弄清楚它发生在哪里......事实上,我根本没有看到以下代码所做的事情。

EDIT2: 我做了一些测试(花了我一些时间),并发现,我的自定义代码不是禁用该功能。事实上,组合框填充ComboBoxModel的某种错误实现阻止了跳跃。

我现在可以输入c并跳转到以c开头的第一个条目。 然而,我无法输入" " (空间),因为弹出窗口将会关闭。我找到this回答,但似乎过于复杂。难道没有更容易的方法吗?

1 个答案:

答案 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();
            }
        });
    }
}

有几个人建议您使用组合框渲染器可能有问题,我认为它们可能是正确的。无论如何,运行此示例并验证自己的行为是否符合预期。验证时,请更新此示例并使用渲染器。如果它像以前一样停止运行,那么您将确定问题所在。祝你好运。