【问题标题】:JComboBox: Not editable but typeableJComboBox:不可编辑但可输入
【发布时间】:2014-12-10 15:11:47
【问题描述】:

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

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

有没有办法让 JComboBox 只“可输入”而不是“可编辑”,所以它可以让您输入值,但前提是它们至少匹配下拉列表中的一项?

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

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

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

【问题讨论】:

  • JComboBox 默认情况下是“可输入的”。如果您将其聚焦并开始输入,它将跳转到以您输入的内容开头的元素,尽管您输入的内容不可见。
  • @Marco7757,它可以使用 Windows、Metal 和 Nimbus,这些都是我可以在 Window 机器上发短信的 LAF。如果它不适用于 Mac、Linux 等,我会感到非常惊讶,因为这种行为应该是所有平台的标准。如果您仍有问题,请发布您的SSCCEdemonstrating 问题以及操作系统信息。您应该发布一个包含所有问题的 SSCCE,这样我们就无需猜测您在做什么。
  • @joeyrohan,“不工作”再一次没有任何意义,除非发布了 SSCCE 以显示所使用的代码。如果它不起作用,那么您可能有一些用于组合框的自定义代码。这是默认功能。
  • 我想知道在地球上失去默认功能可能会被视为 BetterJComboBox。另一方面,我认为问题可能出在组合框渲染器上:参见@camickr 的this post
  • @dic19, I think the problem could be the combo box renderer - 这也是我的猜测。我仍在等待 OP 发布正确的SSCCE,所以我们掌握了所有信息。当人们希望我们继续猜测他们的代码到底在做什么时,我感到很沮丧......

标签: java swing jcombobox


【解决方案1】:

作为icza mentioned:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多