这个Swing行为是一个错误吗?神秘的BoxLayout对齐

时间:2013-01-17 02:54:32

标签: java swing user-interface layout-manager boxlayout

我一直在玩WindowBuilder Pro Java Swing布局,遇到了一些我最终能够减少到SSCCE的奇怪行为。请考虑以下源代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class WBPTest2 {
    private JFrame frame;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    WBPTest2 window = new WBPTest2();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public WBPTest2() {
        initialize();
    }
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JPanel panel_1 = new JPanel();
        panel_1.setBackground(Color.GREEN);
        panel_1.setMaximumSize(new Dimension(32767, 100));
        panel.add(panel_1);
        panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));

        JPanel panel_2 = new JPanel();
        panel_2.setBackground(Color.BLUE);
        panel_2.setMaximumSize(new Dimension(32767, 100));
        panel.add(panel_2);
        panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
    }
}

它给出了以下布局:

enter image description here

无论出于何种原因,panel_1,绿色的,漂浮在右边。使用代码中的一些参数,我只能找到两种方法来完全消除绿色面板左侧的间隙:

  • hgap构造函数中的vgappanel_2更改为0.

OR

  • minimumSize的{​​{1}}更改为(0,0)。

做其中任何一个,我们得到这个:

enter image description here

现在,问题是,为什么panel_2中的minimumSizehgapFlowLayout中的panel_2与预防panel_1有关从一直填充到其父级的左边?如果我minimumSize中的hgap想要FlowLayout大于零且panel_2大于零,该怎么办?那么我如何消除BoxLayoutpanel_1左侧的差距?

无论我对panel_1做什么 ,我都无法填充其父容器的整个宽度(除非我如上所述编辑panel_2)。具有讽刺意味的是,如果我将alignmentX的{​​{1}}设置为panel_1,它实际上会浮动到左侧。但差距仍然存在(刚才在右边)。当我填充RIGHT_ALIGNMENT内容并增加其大小时,其右侧的差距越来越小,但从未完全消失,令人沮丧。

这不仅仅发生在panel_1panel_2的情况下......它也会发生在FlowLayout以及许多其他类型......通常不具有JScrollPane的类型{1}}参数,这意味着修复hgap左侧间隙的唯一方法是将新容器的panel_1更改为0,这似乎又愚蠢且无关,最重要的是可能不会是我的设计意图。

1 个答案:

答案 0 :(得分:3)

在面板1和2上设置alignmentX并填充屏幕。

两个不同的布局管理器似乎会导致面板设置不同的对齐默认值。