有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

调用setSelectedItem()后java JComboBox弹出单元格高度错误

我想要一个下拉框,其中选定的元素在未选中时为一行,但当我从下拉框中选择时,每个单元格都较高,并显示一些额外的信息

Drop down cells are multiple lines

这是通过以下代码实现的:

import java.awt.Component;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;

public class ComboJFrame extends javax.swing.JFrame {

    private boolean popup;

    private javax.swing.JComboBox jComboBox1;

    public ComboJFrame() {
        initComponents();
    }

    private void initComponents() {

        jComboBox1 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.FlowLayout());

        DefaultComboBoxModel model = new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3",
                                                                                                                                                                         "Long Long Item 4" });
        jComboBox1.setModel(model);
        jComboBox1.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                System.out.println("rend = " + value);
                // if popup is showing we need to make elements tall
                if (popup) this.setText("<html>" + value.toString().replaceAll(" ", "<br/>\n"));
                return this;
            }
        ;
        });
                jComboBox1.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
            public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
                popup = false;
                System.out.println("popup = " + popup);
            }

            public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
                popup = false;
                System.out.println("popup = " + popup);
            }

            public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
                popup = true;
                jComboBox1.invalidate();
                System.out.println("popup = " + popup);
            }
        });
        getContentPane().add(jComboBox1);

        pack();

        model.setSelectedItem("Item 3");  // THIS GIVES THE PROBLEM
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ComboJFrame().setVisible(true);
            }
        });
    }
}

问题是如果我通过编程选择一个项目,比如

        model.setSelectedItem("Item 3");

然后JCombobox获取错误的单元格高度并显示

enter image description here

这仅在以编程方式选择项目时才会发生。如果我用鼠标手动点击选择一个项目,然后再次打开弹出窗口,它就会消失

我在使用Java7和Java8的UbuntuLinux14.04上看到了这一点

我想把它修好,并想知道Windows和Mac是否有同样的问题

奇怪的是,如果我将项添加到模型中,使setSelectedItem永远不会被调用,比如:

model.removeAllElements();
model.addElement("Item 3");
model.insertElementAt("Item 2",0);
model.insertElementAt("Item 1",0);
model.addElement("Long Item 4");

那么问题就不会出现了

另一种解决方法似乎是选择项目,然后重新设置模型:

model.setSelectedItem("Item 3");
jComboBox1.setModel(new DefaultComboBoxModel());
jComboBox1.setModel(model);

上面是测试代码,真正的应用程序是用于Apertium机器翻译,组合框如下所示:

Apertium-viewer combobox


共 (0) 个答案