java - 这种 Swing 行为是错误吗?神秘的 BoxLayout 对齐方式

标签 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 ,绿色的,漂浮在右边。尝试使用代码中的一些参数,我只能找到两种方法来完全消除绿色面板左侧的间隙:

  • 更改hgapvgappanel_2构造函数为 0。

  • 更改minimumSizepanel_2到 (0,0)。

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

enter image description here

现在,问题是,到底为什么 minimumSizehgap对于 FlowLayoutpanel_2与防止panel_1有关从一直填充到其父项的左侧?如果我碰巧想要 minimumSize 怎么办?大于零,并且 hgap大于零,对于我的 FlowLayoutpanel_2 ?那么我将如何消除 BoxLayout 左侧的间隙?在 panel_1

无论我对 panel_1 做什么 ,我无法让它填满其父容器的整个宽度(除非我如上所述编辑 panel_2)。具有讽刺意味的是,如果我设置 alignmentX对于 panel_1RIGHT_ALIGNMENT ,它实际上向左浮动。但是差距还是存在的(就在右边)。如我填写panel_1随着内容的增加和它的大小的增加,它右边的差距越来越小,但从未完全消失,令人沮丧。

这不仅仅发生在 panel_2 时是 FlowLayout ...它也发生在JScrollPane和许多其他类型...通常没有 hgap 的类型参数,这意味着修复 panel_1 左侧间隙的唯一方法是改变新容器的minimumSize到 0,这又显得愚蠢和无关,最重要的可能不是我的设计意图。

最佳答案

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

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

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

相关文章:

java - JTable 没有从数据库附加数据

Java swing、SwingWorker、进程栏不会更新

javascript - ASP.NET 中的 ExtJS 和 jQuery

java - DatagramSocket 暂时停止接收数据包(Java)

java - 如何为 Spring 框架 webapps 中 Quartz 计划作业执行的代码配置编码 (UTF-8)?

java - jsf - 在 faces-config 中注册 SessionListener

java 文件中的换行符

multithreading - Java线程安全v从单独的线程显示对话框

python - 默认文本以及列表 textvariable Entry widget Tkinter

user-interface - meteor js 模板呈现与 onRendered