如何在 java 中制作自定义嵌套布局

how to make custom nested layout in java

我正在尝试在 java 中填写此表格 我得到了这个结果

如何将 b6 放在顶部中央 和底部中心的 b4 以及如何更改拆分面板位置

  • 在拆分窗格的左侧,将组合框放在 GridBagLayout(没有约束)中,使其水平和垂直居中。
  • 拆分窗格的右侧。 GridLayout 有垂直填充。添加一个 EmptyBorder 以获得组件周围的填充。
  • 将拆分窗格放在 BorderLayout
  • CENTER
  • Traducteur 标签进入边框布局的 PAGE_START
  • 带有 FlowLayout 的面板中的 Help / Exit 按钮。将该面板放在边框布局的 PAGE_END 中。

/鳍

这可能是这样的:

先看看 Laying Out Components Within a Container

您需要分解您的需求并关注哪些布局会满足您的需求。

我将从 BorderLayout 开始,因为它使您能够在顶部和底部拥有两个组件,这符合这些组件的首选大小,并且可以允许中心组件根据需要调整大小window.

可用 space

标题很简单,就一个JLabel。对于按钮,我使用了 JPanelGridBagLayout,因为它默认将组件居中,但它不会均匀地填充组件,所以要小心。

JSplitPane 的前导和尾随组件我使用了 GridBagLayout,因为它允许将 child 组件布置在容器的中心并允许大在管理组件方面的灵活性。

我使用 EmptyBorder 在组件的某些部分周围添加了一些填充。有多种方法可以实现这一点,但这只是一种方法。

注意,GridBagLayout 非常灵活,但它是一个复杂的布局管理器。

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());

            JLabel label = new JLabel("Traducteur");
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setBorder(new EmptyBorder(10, 10, 10, 10));

            add(label, BorderLayout.NORTH);

            JPanel actions = new JPanel(new GridBagLayout());
            actions.add(new JButton("Help"));
            actions.add(new JButton("Exit"));
            actions.setBorder(new EmptyBorder(10, 10, 10, 10));

            add(actions, BorderLayout.SOUTH);

            JSplitPane splitPane = new JSplitPane();

            JPanel leadingPane = new JPanel(new GridBagLayout());
            leadingPane.setBorder(new EmptyBorder(40, 20, 40, 20));
            JComboBox<String> comboBox = new JComboBox<>();
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
            model.addElement("In English");
            comboBox.setModel(model);
            leadingPane.add(comboBox);

            splitPane.setLeftComponent(leadingPane);

            JPanel trailingPane = new JPanel(new GridBagLayout());
            trailingPane.setBorder(new EmptyBorder(40, 20, 40, 20));
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;

            trailingPane.add(new JTextField("Some text"), gbc);
            trailingPane.add(new JTextField("Some more text"), gbc);

            splitPane.setRightComponent(trailingPane);

            add(splitPane);
        }

    }
}