当前位置: 首页 > 知识库问答 >
问题:

JComboBox:不可编辑但可键入

后源
2023-03-14

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

所以我把JComboBox设置成可编辑的,这样他们就可以输入最后一个元素了。但是,我的数据库不接受该组合框的下拉列表中没有的任何值。

有没有办法使JComboBox仅“可键入”而不是“可编辑”,因此它将允许您键入值,但前提是它们与下拉列表中的至少1个项目匹配?

编辑:事实证明,上面要求的功能本身已经实现了。然而,我的应用程序正在使用自定义代码,不知何故禁用了它。我不知道它发生在哪里...事实上,我根本看不出下面的代码到底在做什么。

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

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

共有1个答案

金晨
2023-03-14

正如icza提到的:

默认情况下,JComboBox是“可键入的”。如果您聚焦它并开始键入,它将跳转到以您键入的内容开始的元素,尽管您键入的属性不可见。

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

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

 类似资料:
  • < br >我有这段代码,其中我设计了一个< code >可编辑的JComboBox来侦听我的< code>keyPressed事件,并显示一条消息,说明键已被按下。但我不知道为什么这没用。作为初学者,我可能在逻辑上/概念上犯了错误。 因此,我想征求关于如何构建代码的建议,以使其工作。 密码

  • 我正在使用金属 L 但当我这样做时,cb。setEditable(false),框内出现一个附加边框(在图片“下拉”中变为红色,您可以在名为“固定”的图片中看到原始颜色)。虽然我尝试设置边界,也尝试使用自己的CellRenderer,但边界仍然会被绘制。在我看来,不需要的边界不是来自细胞渲染器。当我试图从cb本身操纵边框时(请参见注释/),它只添加/删除了一个额外的外部边框。编辑部分似乎也不对我负

  • 如何在jcombobox中添加键事件侦听器,以便它接受EX的整个字符串。如果我添加's',它应该在数据库中搜索以's'开头的字符串,如果没有结果,那么它应该等待用户在组合框中键入其他字符来获得类似的结果

  • 是否可以使可单击但不可编辑。 我不希望它是可编辑的(键盘也不应该出现,我们也不应该改变提示) 实际上,我只想使用编辑文本作为带有提示的图像(不能更改)。我知道实际的方法是使用一个和一个,但我希望它尝试使用,因为这样我将只使用一个视图,而不是2个。而且每件事都是动态的,所以没有XML。 对于上述需求,XML中的解决方案是android:editable=“false”,但我想在Java中使用它。 但

  • 问题内容: 首先:很抱歉,我无法提供SSCCE。我试图在一个小项目上重现此问题,但是没有成功,或者我应该说成功,因为它在那里工作! 所以这是我的问题:我有一个可编辑的JCombobox,它应通过单击编辑器组件来监听焦点事件。但事实并非如此。 这是我附加侦听器的代码段: 我已经尝试删除组合框上的所有其他侦听器,删除观察者模式,保护组合框并将侦听器附加到每个孩子上,… 是否有调试事件的好方法? 可以在

  • 首先:很抱歉,我无法提供SSCCE。我试图在一个小项目上重现这个问题,但没有成功,或者说成功,因为它在那里工作! 这就是我的问题:我有一个可编辑的JCombobox,它应该通过单击编辑器组件来收听焦点事件。但它没有。 下面是一个代码片段,我在其中附加了侦听器: 我已经尝试删除组合框上的所有其他侦听器,删除观察者模式,使组合框受到保护并将侦听器附加到每个孩子上,... 我也试着像这篇文章中写的那样重