调用setSelectedItem()后java JComboBox弹出单元格高度错误
我想要一个下拉框,其中选定的元素在未选中时为一行,但当我从下拉框中选择时,每个单元格都较高,并显示一些额外的信息
这是通过以下代码实现的:
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获取错误的单元格高度并显示
这仅在以编程方式选择项目时才会发生。如果我用鼠标手动点击选择一个项目,然后再次打开弹出窗口,它就会消失
我在使用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机器翻译,组合框如下所示:
共 (0) 个答案