Java JComboBox不显示箭头

Java JComboBox不显示箭头,java,swing,layout,jcombobox,Java,Swing,Layout,Jcombobox,我一直在这个网站和谷歌上搜索我的问题的解决方案,但我什么也找不到。我认为它应该只是工作;然而,事实并非如此。我的JComboBox的箭头图标没有显示,我找不到任何地方可以将其可见性设置为true 这是我的密码: public class Driver implements ActionListener { private JTextField userIDField; private JTextField[] documentIDField; private JComboBox reposit

我一直在这个网站和谷歌上搜索我的问题的解决方案,但我什么也找不到。我认为它应该只是工作;然而,事实并非如此。我的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();
        }
    }
}
以下是问题图片的链接:


如果有人能帮上忙,那就太棒了。

您显示的代码可以工作,但看起来您正在与封闭容器的默认值作斗争。这里,
ComboTest
是一个
JPanel
,默认为
FlowLayout

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://stackoverflow.com/a/10824504/230513
*/
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();
            }
        });
    }
}
附录:一般情况下,不要使用,如您的说明所示。我已将示例更改为使用
GridLayout
;注释掉
setLayout()
调用以查看默认的
FlowLayout

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://stackoverflow.com/a/10824504/230513
*/
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();
            }
        });
    }
}


我也有同样的问题。我通过重新验证面板并用以下代码重新喷漆修复了它:

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

这似乎不是你所遇到的问题,但我发现这篇文章是因为同样的箭头消失的问题


在我的例子中,这是由于我在刷新所使用的数据后尝试清空并重用
JComboBox
时,错误地使用了
JComboBox
上的
.removeAll()
,而不是
.removeAllItems()
。我想我会把它作为一个答案,以防其他人出于类似的原因遇到此线程。

可能有点晚了,但对于那些仍在寻找简单且故障安全的方法来使用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);
        }
    }
}
公共类FixedJComboBox
扩展JComboBox{
//复制构造函数
公共固定JComboBox(){
超级();
}
公共固定JComboxBox(ComboxModel aModel){
超级(阿莫代尔);
}
公共固定JComboBox(E[]项){
超级(项目);
}
公共固定JComboBox(向量项){
超级(项目);
}
@凌驾
公共空心收进边界(整数x、整数y、整数宽度、整数高度){
超级立根(x、y、宽度、高度);
//箭头是第一个(也是唯一一个)组件
//这是默认添加的
组件[]comps=getComponents();
如果(comps!=null&&comps.length>=1){
组件箭头=组件[0];
//20是箭头的默认宽度(至少对我而言)
箭头。设置尺寸(20,高度);
setLocation(width-arrow.getWidth(),0);
}
}
}
如上所述,错误是由于错误地将箭头的位置和大小设置为
(0,0)
,然后出现一些重新绘制问题。通过简单地覆盖
setBounds()
函数,在UI/layout manager错误地更新箭头后,箭头总是会得到纠正

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


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

您使用的是什么环境/L&F?你能展示正在展示的东西的图像吗?另外,请记住,对于
JComboBox
,实际上并不需要按钮-整个
JComboBox
有点像按钮;组合框显示出来,旁边有一个下拉箭头。我相信按钮的存在/不存在将取决于LnF,因此您可能会在windows/OSX/unix等上体验到不同的行为。1)单击选择“”是否有效?如果不是,则不应在组合中列出。2)
environment.setSize(150,20)不要这样做。3) 
environment.setLocation(175195)也不要这样做。4) 
w.add(环境,0)使用有意义的属性名称。不要使用魔法数字。4) 为了更快地获得更好的帮助,请发布一个。这是一个表单的一部分,我让人们用JFrame中的一系列其他内容(jLabel、JTextFields等)填写该表单。我试着建立一个JPanel并把它放在我需要的位置,但它仍然没有小箭头。我还尝试将环境布局设置为FlowLayout。这也没有改变任何事情。如果您能提供更多帮助,我们将不胜感激。结果取决于封闭容器的布局。尝试将组件添加到上面的示例中,并查看
FlowLayout
如何响应。然后尝试
setLayout(新的GridLayout(0,1))
进行比较;然而,当我试图在代码中实现它时,它根本就不会运行。(如中所述,我在我的项目中将您的类设置为类,并使用构造函数创建了新变量)。什么也没出现。当我在自己的项目中只使用您的代码时,它工作得很好。有没有一种简单的方法可以强制在我正在使用的JFrame或JComboBox中使用FlowLayout?是的,将
ComboTest
面板嵌套在应用程序的面板中。我怀疑你和默认布局混在一起了。请编辑您的问题以包含显示问题的。好的,我已经删除了几乎所有不需要查看我的问题的内容。下拉菜单位于正确的位置,但仍显示没有向下箭头:(对一个老问题的老答案,但它只是让我省去了很多困惑!谢谢:)也有同样的问题
frame.revalidate()
frame.repaint()
对我有效。