我一直在使用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));
    }
}


它具有以下布局:



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


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


要么


minimumSizepanel_2更改为(0,0)。


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



现在的问题是,为什么在minimumSizehgapFlowLayoutpanel_2panel_1与防止minimumSize完全填充其父代的左侧有关?如果我碰巧希望hgap中的FlowLayoutpanel_2大于零,并且BoxLayout大于零怎么办?那么,如何消除panel_1panel_1左侧的间隙?

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

这不仅在FlowLayoutJScrollPane时发生...在hgap和许多其他类型中也会发生...通常不具有panel_1参数的类型,这意味着唯一的方法修复minimumSize左侧的间隙是将新容器的更改为0,这似乎又很愚蠢且无关紧要,而且最重要的可能不是我的设计意图。

最佳答案

在面板1和2上设置alignmentX,它会填满整个屏幕。

看来这两个不同的布局管理器导致面板设置不同的对齐默认值。

关于java - 这是Swing行为的错误吗?神秘的BoxLayout对齐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14371482/

10-15 07:42