HI,
我有一个JComboBox,我正在添加我的自定义对象项。但有时添加的对象是空的。因此,当comboBox中包含空项时,它会折叠并变得非常薄。但是一旦人口稠密,就变成了高度。即使没有添加任何项目或空项目,有人可以建议保持JComboBox的高度。
private final JComboBox comboField = new JComboBox(); comboField.removeAllItems(); comboField.addItem(getFirstConfig()); comboField.addItem(getSecConfig());
由于
答案 0 :(得分:1)
您可以通过设置最小尺寸来完成,但正确的值取决于字体。您可以猜测该值,也可以在addNotify
的帮助下从FontMetrics
进行设置。
我一般认为通过制作第一个项目更容易:“ - 选择配置 - ”,或者,如果您知道没有可供选择的项目:“ - 没有配置可用 - - “
<强>更新强>
由于您无法使用占位符,因此您的备选方案取决于布局管理器和正在使用的LAF。
大多数情况下,这相当于设置JComponent的最小和/或首选大小。这是不准确的,但我通常使用GridBagLayout
并且使用这种方法有很好的结果:
@Override
public void addNotify() {
super.addNotify();
combo.setMinimumSize(atLeast(combo.getMinimumSize(), 100, 20));
combo.setPreferredSize(atLeast(combo.getPreferredSize(), 100, 20));
}
private Dimension atLeast(Dimension d, int minWidth, int minHeight) {
d.width = Math.max(minWidth, d.width);
d.height = Math.max(minHeight, d.height);
return d;
}
将100,20替换为适合您的最小值。
答案 1 :(得分:0)
您是在谈论下拉列表还是框本身。如果它只是盒子,你不能只设置它的最小高度吗?
更新: 根据您的评论,我做了一些实验。根据您使用的布局管理器,组件大小的行为是不同的。它可能的一种方法是将组合框包装在流布局面板中并设置首选大小,如下所示。如果这仍然无济于事,请告诉我你的布局经理是什么。
代码(可执行演示):
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class JComboBoxTest {
private static JComboBox combo;
private static String[] labelStrs = new String[5];
private static void createAndShowGUI() {
final JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i = 0; i < 5; i += 1) {
labelStrs[i] = "I am label #" + i;
}
combo = new JComboBox(labelStrs);
//------------------------------------------------
combo.setPreferredSize(new Dimension(100, 20));
//------------------------------------------------
JButton remove = new JButton("remove");
remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
combo.removeAllItems();
frame.repaint();
}
});
JButton add = new JButton("add");
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 5; i += 1) {
combo.addItem(labelStrs[i]);
}
frame.repaint();
}
});
Panel container = new Panel();
Panel wrapper = new Panel();
Panel btns = new Panel();
container.setLayout(new FlowLayout());
container.add(combo);
wrapper.add(container);
btns.add(remove);
btns.add(add);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(wrapper, BorderLayout.CENTER);
frame.getContentPane().add(btns, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 2 :(得分:0)
刚刚添加了一个检查,如果Jcombobox的选项为null,则添加一个空字符串“”。这可以防止ComboBox崩溃。