Java 如何在swing中通过中间面板使视图居中

Java 如何在swing中通过中间面板使视图居中,java,swing,layout-manager,Java,Swing,Layout Manager,我必须构建一个包含三个面板的UI,左面板、中面板和右面板,面板应该水平对齐 左侧和右侧面板应尽可能获得最大和相等的宽度,而中间面板可以根据其子组件的要求获得最小宽度,一旦添加面板,视图应以中间面板为中心 我已经完成了以下测试代码来构建UI import java.awt.Color; import java.awt.GridBagLayout; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import java

我必须构建一个包含三个面板的UI,左面板、中面板和右面板,面板应该水平对齐

左侧和右侧面板应尽可能获得最大和相等的宽度,而中间面板可以根据其子组件的要求获得最小宽度,一旦添加面板,视图应以中间面板为中心

我已经完成了以下测试代码来构建UI

import java.awt.Color;
import java.awt.GridBagLayout;

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

public class SwingTest extends JFrame {
    private static final long serialVersionUID = 1L;

    public SwingTest() {
        setTitle("Swing Test");
        setSize(750, 350);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(getParent());

        // Rule used to find the component positions, for the testing purpose
        Rule rule = new Rule(Rule.HORIZONTAL, true);
        rule.setPreferredWidth(10);
        rule.setPreferredHeight(40);

        SidePanel leftPanel = new SidePanel("Left");
        SidePanel rightPanel = new SidePanel("Right");

        JPanel middlePanel = new JPanel();
        middlePanel.setBorder(BorderFactory.createLineBorder(Color.black));

        // Add left,right and middle panel horizontally
        JPanel containerPanel = new JPanel();
        containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.X_AXIS));
        containerPanel.add(leftPanel);
        containerPanel.add(middlePanel);
        containerPanel.add(rightPanel);

        // Add rule and container panel Vertically
        JPanel outerPanel = new JPanel();
        outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
        outerPanel.add(rule);
        outerPanel.add(containerPanel);

        add(outerPanel);
    }

    public static void main(String[] args) {
        SwingTest test = new SwingTest();
        test.setVisible(true);
    }

    private static class SidePanel extends JPanel {
        private static final long serialVersionUID = 1L;

        private SidePanel(String text) {
            setLayout(new GridBagLayout());
            add(new JLabel(text));
        }
    }
}
我使用了OracleSwing教程网站上的Rule类,它可以用来查找组件的位置。得到

我遇到的问题如UI屏幕截图所示,视图不是通过中间面板居中,现在视图的中心宽度为“左+中面板=右面板”

我不想手动设置面板的高度和宽度,它应该由LayoutManager自己处理

我想要的是中间面板必须以左+中/2=中/2+右面板宽度的方式居中


我找不到使中间面板居中查看的方法,有人能帮我找到解决方案吗?

您需要了解BoxLayout是如何工作的

第一个空间按每个组件的首选大小分配。然后,如果有额外的空间,该空间将分配给每个组件

因为右标签的首选大小大于左标签,所以中间看起来不居中。因此,当分配额外的空间时,右侧比左侧大

这很容易测试。只需将右侧面板的文本更改为左侧

然而,这引出了另一个问题——为什么中间面板的大小没有改变?我不知道这个问题的答案。尽管由于某些原因,默认的FlowLayout似乎与GridBagLayout不同。同样,您可以通过将中间面板的布局更改为GridBagLayout来测试这一点

如果你总是希望左/右面板是相同的大小,那么你可能想考虑使用。使用此布局,基本代码为:

 RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
 JPanel panel = new JPanel( rl );
 panel.add(leftPanel, new Float(1));
 panel.add(middle, new Float(3));
 panel.add(rightPanel, new Float(1));
现在,左/右面板的大小将相同,与添加到每个面板的组件无关