如何减小SWT中组合框的默认大小(项目的高度)?

问题描述 投票:0回答:2

我用swt创建的组合框的大小是固定的(项目的高度不能改变)。有什么办法可以改变这个默认高度吗?即使我尝试减小项目的字体大小,但没有成功。

java combobox height swt size
2个回答
2
投票

简短的回答是:您无法显式设置组合项的高度。

与所有 SWT 小部件一样,组合框使用 OS/Window 系统的本机小部件,因此仅限于各自的小部件功能。在 Windows 上,项目高度会适应字体大小

combo.setFont( new Font( combo.getDisplay(), "Arial", 27, SWT.NONE ) );
Combo with arge font

combo.setFont( new Font( combo.getDisplay(), "Arial", 7, SWT.NONE ) );
Combo with small font

但其他平台可能只适应一定程度或者根本不适应。


0
投票

还有一个技巧:您可以为组合框指定顶部和底部插入为零或负数的边框。您获得的效果将取决于您使用的外观和感觉。对于某些外观和感觉,组合框的高度没有问题。你必须子类化

DefaultListCellRenderer

The trick with custom border

指定零插入是安全的。如果您使用不带变音符号的大写文本并且不计划任何国际化/本地化,则可以指定负插入。 在一般情况下,负数插入不起作用,因为它们让您使用的空间是出于某种目的而保留的,例如大写字母上方的变音符号。可能会发生这样的情况,即您使用的文本中,基线下方和大写字母高度上方的空间可能会被重复使用。

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());
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.