Java 将中心两侧的2套/项目对齐

Java 将中心两侧的2套/项目对齐,java,swing,alignment,center,layout-manager,Java,Swing,Alignment,Center,Layout Manager,我试图找出在JavaSwing应用程序中对齐面板中央两组项的最佳方法。面板位于BorderLayout的North位置,其宽度由布局的中心位置的JTextField确定。我遇到的问题是,我有一组标签和较小的文本字段,我想居中放置,以便标签的结尾和第一个文本字段的开头在面板的中心相遇 我尝试了GroupLayout,但结果如下: 注意:由a+分隔的两个文本字段位于子面板中 我正在努力实现以下目标: 显然,我要么错过了什么,要么这比必要的要复杂得多。事实上,我经常碰到这个问题!我很惊讶没有一个特

我试图找出在JavaSwing应用程序中对齐面板中央两组项的最佳方法。面板位于
BorderLayout
North
位置,其宽度由布局的
中心
位置的
JTextField
确定。我遇到的问题是,我有一组标签和较小的文本字段,我想居中放置,以便标签的结尾和第一个文本字段的开头在面板的中心相遇

我尝试了
GroupLayout
,但结果如下:

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

我正在努力实现以下目标:

显然,我要么错过了什么,要么这比必要的要复杂得多。事实上,我经常碰到这个问题!我很惊讶没有一个特别的网格布局专门用于此

尝试使用
GridLayout
执行此操作会导致以下情况:

所以。。。获取我要查找的布局(第二张图像)的最简单方法是什么

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);
考虑使用a,因为它可以对单个组件的放置进行更多的控制,并尽可能尊重组件的首选大小(除非通过使用
GridBagConstraints
覆盖它们)


也可以考虑<代码> GoLoopOuts,参见。添加我的代码,返回<代码> GoLoopOuts< /Cult>结果@。MadProgrammer:您能提供一个如何使用GridBagLayout实现这一点的示例吗?我可能想到的是一个旧的PS图象处理软件JavaScript UI,但我记得标签和文本字段没有排队的最后一次我让他们在中间遇到。为了更好地帮助更快,张贴一个(最小的完整和可验证的例子)。非常好!他们排得很好。非常感谢你!
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);
        }

    }

}