JGoodies FormLayout拒绝调整我的JComboBox的大小

时间:2014-10-25 17:37:11

标签: java swing jgoodies

似乎JComboBox是一个非常,非常讨厌调整其高度的Java组件......我尝试了set[Preferred|Minimum|Maximum]Size()和各种不同布局管理器的无数组合,直到下面的{ {1}}代码终于奏效了:

GroupLayout

但我现在转到JGoodies JComboBox cmbCategories = new JComboBox(new String[] { "Category 1", "Category 2" }); ... layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(cmbCategories, GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE) ... layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(cmbCategories, GroupLayout.PREFERRED_SIZE, 40, GroupLayout.PREFERRED_SIZE) ,再一次拒绝调整该死的组合框!我目前有以下代码:

FormLayout

在JFormDesigner编辑器中显示我想要的内容,但在运行程序时,它只会被设置回默认值!

那么我需要用什么样的神奇hocus-pocus来让它发挥作用?!我真的不想在JPanel contentPane = new JPanel(); contentPane.setLayout(new FormLayout("50dlu, $lcgap, 110dlu, $glue, " + "default, 1dlu, 45dlu, 1dlu, 45dlu", "2*(default, 0dlu), default, " + "$lgap, fill:30dlu, $lgap, default:grow")); ... contentPane.add(cmbPanel, CC.xy(1, 7, CC.FILL, CC.FILL)); 中重新定义所有内容两次,但在尝试调整一个该死的组合框的5个小时后,我正处于秃顶的边缘!

任何可以提供帮助的人的MTIA:)

1 个答案:

答案 0 :(得分:2)

首先,我们必须避免在我们的组件中设置硬编码大小,因为Swing旨在与Layout Managers一起使用,我们的应用程序必须能够在不同的平台,不同的屏幕分辨率,不同的PLaF和不同的字体大小。组件大小和定位是布局管理员的责任,而不是开发人员。

现在,一般来说,当我们想要为Swing组件设置首选大小时,我们不使用任何setXxxSize()方法,而是覆盖getPreferredSize()方法:

JComboBox comboBox = new JComboBox() {
    @Override
    public Dimension getPreferredSize() {
        return isPreferredSizeSet() ? 
                super.getPreferredSize() : new Dimension(100, 40);
    }
};

但是,执行此操作不会影响弹出窗口显示时列出的项目的大小:仍然具有由combo box cell renderer确定的首选大小的单元格。因此,为了避免这种不良行为,更好的解决方案是:

例如:

JComboBox comboBox = new JComboBox();
comboBox.setPrototypeDisplayValue("This is a cell's prototype text");
comboBox.setRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        int width = c.getPreferredSize().width; // let the preferred width based on prototype value
        int height = 40;
        c.setPreferredSize(new Dimension(width, height));
        return c;
    }
});

我再次强调,这是一种粗俗/肮脏的方式来调整我们的组合框。恕我直言,最好不要乱用组合框高度,只需使用setPrototypeDisplayValue(...)来设置PLaF安全方式的首选宽度。