java - JComboBox:不可编辑但可输入

标签 java swing jcombobox

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

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

有没有办法让 JComboBox 仅“可键入”而不是“可编辑”,这样它就可以让您键入值,但前提是它们至少与下拉列表中的 1 项匹配?

编辑: 事实证明,上述要求的功能本身已经实现。但是,我的应用程序正在使用以某种方式禁用它的自定义代码。我不知道它发生在哪里……事实上,我根本看不出下面的代码到底在做什么。

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

我现在可以输入 c,它会跳转到以 c 开头的第一个条目。 但是,我不能输入“”(空格),因为这样弹出窗口就会关闭。我找到了 this答案,但它似乎过于复杂。没有更简单的方法吗?

最佳答案

作为icza mentioned :

JComboBox is "typeable" by default. If you focus it and start typing, it will jump to the element that starts with what you type, although what you type is not visible.

您正在描述组合框的默认行为。以下示例完全符合您的描述(从 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();
            }
        });
    }
}

一些人建议您的组合框渲染器可能有问题,我认为他们可能是对的。无论如何,运行这个示例并亲自验证它是否按预期运行。当您验证这一点时,请更新此示例并使用您的渲染器。如果它不再像以前那样运行,那么您就会确定问题出在哪里。

关于java - JComboBox:不可编辑但可输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384294/

相关文章:

java - 如何单独突出显示

java - MySQL Java 使用 JComboBox 设置第二个 JComboBox

java - 使用 JComboBox Open 删除所有组合框项目时出现异常

java - 断言对象是一个有效的顶级 json 可序列化

java - 重数计算的最佳有效解决方案?

java - 如何在ne04j中的对象列表中添加对象

java - JDialog如何设置透明背景

java - 更改 BufferedImage 的内容,然后更新 JFrame 以反射(reflect)它

java - 已将 Weblogic 证书添加到本地 JDK cacerts。如何在 PCF 中添加证书,以便我可以通过 mulesoft 成功连接到 Weblogic Jms

具有自动完成功能的 Java JComboBox