JComboBox没有显示箭头

5

我一直在这个网站和谷歌上搜索解决方案,但是我找不到任何东西。我认为它应该可以正常工作,但是它没有。我的JComboBox的箭头图标没有显示出来,我找不到任何地方将其可见性设置为true。

这是我的代码:

public class Driver implements ActionListener {

private JTextField userIDField;
private JTextField[] documentIDField;
private JComboBox repository, environment;
private JButton close, clear, submit;
private JFrame window;

    public Driver()
    {
    window = makeWindow();
    makeContents(window);
    window.repaint();
    }

    private JFrame makeWindow()
    {
    JFrame window = new JFrame("");
    window.setSize(500,300);
    window.setLocation(50,50);
    window.getContentPane().setLayout(null);
    window.setResizable(false);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

    return window;
    }

    private void makeContents(JFrame w)
    {
    makeDropDowns(w);
    w.repaint();
    }

    private void makeDropDowns(JFrame w)
    {       
    String[] repositoryArray = {"Click to select", "NSA", "Finance", "Test"};
    repository = new JComboBox(repositoryArray);
    repository.setSelectedIndex(0);
    repository.addActionListener(this);
    repository.setSize(150,20);
    repository.setLocation(175,165);
    repository.setEditable(false);
    w.add(repository);

    String[] environmentArray = {"Click to select", "Dev", "Test", "Qual"};
    environment = new JComboBox(environmentArray);
    environment.setSelectedIndex(0);
    environment.addActionListener(this);
    environment.setSize(150,20);
    environment.setLocation(175,195);
    //environment.setEditable(false);
    w.add(environment,0);
}

    public void actionPerformed(ActionEvent e) 
    {

    String repositoryID = "null", environmentID = "null";

    if (e.getSource() == repository)
        {
        repositoryID = (String)repository.getSelectedItem();
        }

    if(e.getSource() == environment)
        {
        environmentID = (String)environment.getSelectedItem();
        }
    }
}

这是一个问题的图片链接: image 如果有人能帮忙就太好了。

你使用的是什么环境/外观?能展示一下显示的图片吗?另外,对于JComboBox,按钮并不是真正需要的 - 整个JComboBox就像一个按钮一样工作。 - amaidment
我能够成功运行你的示例;组合框出现并且旁边有一个下拉箭头。我相信按钮的存在/缺失将取决于LnF,因此您可能会在Windows / OSX / Unix等不同的操作系统上体验到不同的行为... - piepera
  1. “点击选择”是有效选项吗?如果不是,它不应该在组合框中列出。
  2. 不要这样做:environment.setSize(150,20);
  3. 也不要这样做:environment.setLocation(175,195);
  4. 使用有意义的属性名称。不要使用魔法数字。
  5. 为了更快地获得更好的帮助,请发布一个SSCCE
- Andrew Thompson
4个回答

11

看起来这不是你所遭受问题的原因,但我因为同样的箭头消失问题而找到了这篇文章。

在我的情况下,由于我错误地使用了.removeAll()删除JComboBox而不是.removeAllItems(),当我试图在数据刷新后清空并重用JComboBox时导致了该问题。 只是想把它包含在答案中,以防其他人因类似的原因而遇到此线程。


1
旧问题的旧答案,但它刚刚为我节省了很多困惑!谢谢 :) - Joe Clay

5
你展示的代码是有效的,但看起来你在与包含容器的默认 布局 对抗。这里,ComboTest 是一个默认为 FlowLayoutJPanel
补充说明:一般来说,不要使用 绝对定位,就像你的 update 所示。我已经改变了示例以使用 GridLayout;注释掉 setLayout() 调用以查看默认的 FlowLayout

enter image description here

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
* @see https://dev59.com/LmTWa4cB1Zd3GeqPDG7R#10824504
*/
public class ComboTest extends JPanel {

    private JComboBox repository = createCombo(new String[]{
        "Click to select", "NSA", "Finance", "Test"});
    private JComboBox environment = createCombo(new String[]{
        "Click to select", "Dev", "Test", "Qual"});

    public ComboTest() {
        this.setLayout(new GridLayout(0, 1));
        this.add(repository);
        this.add(environment);
    }

    private JComboBox createCombo(String[] data) {
        final JComboBox combo = new JComboBox(data);
        combo.setSelectedIndex(1);
        combo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand()
                    + ": " + combo.getSelectedItem().toString());
            }
        });
        return combo;
    }

    private void display() {
        JFrame f = new JFrame("ComboTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ComboTest().display();
            }
        });
    }
}

这是我让人们填写的表单的一部分,其中包括许多其他的东西(JLabels、JTextFields等),它们都在一个JFrame中。我尝试设置了一个JPanel并将其放置在需要的位置,但它仍然没有小箭头。我还尝试将环境的布局设置为FlowLayout。这也没有改变任何东西。如果有更多帮助,将不胜感激。 - Deo
结果取决于封闭容器的布局。尝试向上面的例子中添加组件,看看FlowLayout如何响应。然后尝试使用setLayout(new GridLayout(0, 1))进行比较。 - trashgod
是的,在您的应用程序面板中嵌套ComboTest面板。我怀疑您正在混合使用绝对定位和默认布局。请编辑您的问题,包括一个sscce来展示问题。 - trashgod
好的,我已经删除了几乎所有不必要的内容以便看到我的问题。下拉菜单在正确的位置,但仍然显示它们没有向下箭头。:( - Deo
我已经更新了我的帖子,并附上了问题的截图链接。 - Deo
显示剩余2条评论

2

我遇到了同样的问题。我通过以下代码重新验证和重绘面板来解决它:

myPanel.revalidate();
myPanel.repaint();

我曾经遇到过同样的问题。frame.revalidate()frame.repaint() 对我有用。 - pburgr

1
也许有些晚了,但是对于那些仍在寻找一种简单且可靠的方法来使用JComboBox的人可以使用这个:
public class FixedJComboBox<E>
        extends JComboBox<E> {
    // Copied constructors
    public FixedJComboBox() {
        super();
    }
    public FixedJComboBox(ComboBoxModel<E> aModel) {
        super(aModel);
    }
    public FixedJComboBox(E[] items) {
        super(items);
    }
    public FixedJComboBox(Vector<E> items) {
        super(items);
    }

    @Override
    public void setBounds(int x, int y, int width, int height) {
        super.setBounds(x, y, width, height);

        // The arrow is the first (and only) component
        // that is added by default
        Component[] comps = getComponents();
        if (comps != null && comps.length >= 1) {
            Component arrow = comps[0];
            // 20 is the default width of the arrow (for me at least)
            arrow.setSize(20, height);
            arrow.setLocation(width - arrow.getWidth(), 0);
        }
    }
}

此处所述,该bug是由于错误地将箭头的位置和大小都设置为(0,0),然后出现了一些重绘问题。通过简单地覆盖setBounds()函数,在UI/layout manager错误更新箭头后,箭头总是被纠正。

另外,由于新组件是在旧组件之后添加的(即更高的索引),所以箭头始终位于数组中的第一个元素(假设您不删除并重新添加箭头)。

这个类的缺点是箭头的宽度现在是由常量而不是UI/layout manager决定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接