java - 将 2 组/项目在中心两侧对齐

标签 java swing alignment center layout-manager

我正在尝试找出在 Java Swing 应用程序的面板中心对齐 2 组项目的最佳方法。该面板位于 BorderLayoutNorth 位置,其宽度由位于 Center 位置的 JTextField 决定。布局。我遇到的问题是,我有一组标签和较小的文本字段,我想将它们居中,以便标签的末尾和第一个文本字段的开头在面板的中心相遇。

我尝试过GroupLayout,但最终得到以下结果: enter image description here

注意:由 + 分隔的 2 个文本字段位于子面板中。

我想要实现的目标如下: enter image description here

显然我要么错过了一些东西,要么这比需要做的要复杂得多。我实际上经常遇到这个问题!我很惊讶没有专门为此目的的特殊网格布局。

尝试使用 GridLayout 执行此操作会导致以下结果: enter image description here

那么......获得我正在寻找的布局(第二张图片)的最简单方法是什么?

GroupLayout 示例代码如下:

    JFrame frame = new JFrame();
    JPanel panel = new JPanel(new BorderLayout());
    frame.setContentPane(panel);

    JPanel longText = new JPanel();
    JPanel shortText = new JPanel();
    JPanel mediumText = new JPanel();

    longText.add(new TextField(5));
    longText.add(new JLabel("+"));
    longText.add(new TextField(5));
    shortText.add(new TextField(5));
    shortText.add(new JLabel("+"));
    shortText.add(new TextField(5));
    mediumText.add(new TextField(5));
    mediumText.add(new JLabel("+"));
    mediumText.add(new TextField(5));

    JLabel lExample = new JLabel("Long text example:");
    JLabel sExample = new JLabel("Short:");
    JLabel mExample = new JLabel("Medium Example:");

    JPanel subPanel = new JPanel();
    GroupLayout layout = new GroupLayout(subPanel);
    subPanel.setLayout(layout);
    layout.setHorizontalGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup(Alignment.CENTER)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                    .addComponent(lExample)
                    .addComponent(sExample)
                    .addComponent(mExample))
                .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                    .addComponent(longText)
                    .addComponent(shortText)
                    .addComponent(mediumText))))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER))
    );
    layout.setVerticalGroup(layout.createSequentialGroup()
        .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
            .addComponent(lExample)
            .addComponent(longText))
        .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
            .addComponent(sExample)
            .addComponent(shortText))
        .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
            .addComponent(mExample).addComponent(mediumText))
    );

    JTextArea textArea = new JTextArea() {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600,300);
        }
    };
    textArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    textArea.setAutoscrolls(true);

    panel.add(subPanel,BorderLayout.NORTH);
    panel.add(textArea,BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);

最佳答案

考虑使用 GridBagLayout ,因为它使您可以更好地控制各个组件的放置,并尽可能尊重组件的首选大小(除非您通过使用 GridBagConstraints 覆盖它们)

GridBagLayout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LayoutExample {

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

    public LayoutExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JLabel longText = new JLabel("Long Text Example");
            JLabel shortText = new JLabel("Short Example");
            JLabel medText = new JLabel("Medium Example");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.EAST;
            add(longText, gbc);
            addFields(gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.EAST;
            add(shortText, gbc);
            addFields(gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.EAST;
            add(medText, gbc);
            addFields(gbc);
        }

        protected void addFields(GridBagConstraints gbc) {
            JTextField field1 = new JTextField("0", 5);
            field1.setEnabled(false);
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.gridx++;
            add(field1, gbc);
            gbc.gridx++;
            gbc.insets = new Insets(0, 4, 0, 4);
            add(new JLabel("+"), gbc);
            JTextField field2 = new JTextField(5);
            gbc.gridx++;
            add(field2, gbc);
        }

    }

}

关于java - 将 2 组/项目在中心两侧对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23481536/

相关文章:

java - 如何从Uri中读取文本并放入textView中? Android Studio - Java

java - 在 Eclipse e4 中禁用表查看器中的行

java - 使用 SourceDataLine 时帧速率不稳定

java - Swing 控件上的 block 更改操作

html - 下拉选择器中的内容对齐

C++内存对齐问题

java - 在另一个中编译类时出现编译错误

java - JDK 10 支持的计算字符串宽度(像素)的方法是什么

java - JFrame GUI 卡住 + Phantom

HTML 相对居中对齐