我用swt创建的组合框的大小是固定的(项目的高度不能改变)。有什么办法可以改变这个默认高度吗?即使我尝试减小项目的字体大小,但没有成功。
简短的回答是:您无法显式设置组合项的高度。
与所有 SWT 小部件一样,组合框使用 OS/Window 系统的本机小部件,因此仅限于各自的小部件功能。在 Windows 上,项目高度会适应字体大小
combo.setFont( new Font( combo.getDisplay(), "Arial", 27, SWT.NONE ) );
combo.setFont( new Font( combo.getDisplay(), "Arial", 7, SWT.NONE ) );
但其他平台可能只适应一定程度或者根本不适应。
还有一个技巧:您可以为组合框指定顶部和底部插入为零或负数的边框。您获得的效果将取决于您使用的外观和感觉。对于某些外观和感觉,组合框的高度没有问题。你必须子类化
DefaultListCellRenderer
。
指定零插入是安全的。如果您使用不带变音符号的大写文本并且不计划任何国际化/本地化,则可以指定负插入。 在一般情况下,负数插入不起作用,因为它们让您使用的空间是出于某种目的而保留的,例如大写字母上方的变音符号。可能会发生这样的情况,即您使用的文本中,基线下方和大写字母高度上方的空间可能会被重复使用。
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
class HelloWorldSwing {
private static void createAndShowGUI() {
JFrame frame = new JFrame("ComboBox With Custom EmptyBorder");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel);
String[] items = {"BQbdgqpSŚń", "foo", "bar", "baz", "qux"};
panel.add(new JLabel("1,1 (standard):"));
panel.add(new JComboBox<>(items));
panel.add(new JLabel("0,0:"));
panel.add(new LowComboBox<>(items, 0, 0));
panel.add(new JLabel("-1,-3:"));
panel.add(new LowComboBox<>(items, -1, -3));
panel.add(new JLabel("-2,-2:"));
panel.add(new LowComboBox<>(items, -2, -2));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(HelloWorldSwing::createAndShowGUI);
}
}
class LowComboBox<T> extends JComboBox<T> {
public LowComboBox(T[] items, int top, int bottom) {
super(items);
setRenderer(new LowComboboxToolTipRenderer(top, bottom));
}
static class LowComboboxToolTipRenderer extends DefaultListCellRenderer {
private final EmptyBorder standardBorder = new EmptyBorder(1, 1, 1, 1);
private final EmptyBorder customBorder;
public LowComboboxToolTipRenderer(int top, int bottom) {
customBorder = new EmptyBorder(top, 1, bottom, 1);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (isBorderTrickNeeded()) {
if (index < 0) {
component.setBorder(customBorder);
} else {
component.setBorder(standardBorder);
}
}
return component;
}
static boolean isBorderTrickNeeded() {
// Check for look-and-feels that benefit from low combo boxes.
// The Motif and GTK look-and-feels are not among them.
return "Metal".equals(UIManager.getLookAndFeel().getName());
}
}
}