如何使JCombobox看起来像JTextField

时间:2009-05-04 22:34:38

标签: java swing

是否有一种好的(简单的)方法可以使JCombobox看起来像JTextField? 我的意思是不应该有一个下拉按钮,但是当用户输入内容时它应该显示多种结果。

基本上谷歌,YouTube,脸谱等都有效。

3 个答案:

答案 0 :(得分:6)

JComboBox comboBox = new JComboBox();
comboBox.setUI(new BasicComboBoxUI() {
    @Override
    protected JButton createArrowButton() {
        return new JButton() {
            @Override
            public int getWidth() {
                return 0;
            }
        };
    }
});

使getWidth()返回0可确保:
a)按钮未显示
b)没有为它预留空间,让你输入整个字段

我发现我必须通过.setUI()调用SwingUtilities.invokeLater(),但根据您的代码结构,您可能不必这样做。

如果您想要自动填充,请在组合框中添加一些项目,然后使用AutoCompleteDecorator.decorate(comboBox)。如前所述,AutoCompleteDecorator类是SwingX的一部分。

这可能会使你的盒子在使用另一个L& F时看起来很奇怪,所以你必须选择要实例化的CombiBoxUI,以获得正确的外观。

如果您不想在组合框中没有任何内容时显示下拉列表,请在BasicComboBoxUI中覆盖此方法:

@Override
public void setPopupVisible(JComboBox c, boolean v) {
    // keeps the popup from coming down if there's nothing in the combo box
    if (c.getItemCount() > 0) {
        super.setPopupVisible(c, v);
    }
}

答案 1 :(得分:2)

您的意思是您希望它的行为类似于自动填充先前输入的值的文本字段吗? SwingX包括支持向文本组件添加自动填充功能。

您可以查看的另一个图书馆是JIDE Common Layer。他们的IntelliHints功能可能正是您所寻找的。您可以从here下载演示。

答案 2 :(得分:2)

我有一个非常类似的问题,我不关心弹出箭头,但是我需要在禁用组件时控制文本外观。

我想显示当前值,但禁用列表选择/编辑。使用JComboBox获得此行为的唯一方法是使用comboBox.setEnabled(false);这使文本变得难以理解浅灰色。

我创建了一个ComoBoxUIDecorator,并拦截了一些绘制方法。这具有完全正确的效果 - 箭头显示为灰色,而当前值显示为黑色且可读(如同启用)。

public class ComboBoxUIDecorator extends ComboBoxUI {
 private ComboBoxUI m_parent;

 public ComboBoxUIDecorator(ComboBoxUI x) {
  m_parent = x;
 }
 ...
 public boolean isFocusTraversable(JComboBox c) {
  return m_parent.isFocusTraversable(c);
 }

 public void paint(Graphics g, JComponent c) {
  c.setEnabled(m_displayEnabledState);
  m_parent.paint(g, c);
  c.setEnabled(m_realEnabledState);
 }
}

您可以尝试类似的方法;如果你能找到箭头按钮,你可以在调用m_parent.paint()之后在箭头上画画。