Java gui窗口中组件的对齐

Java gui窗口中组件的对齐,java,swing,user-interface,jpanel,layout-manager,Java,Swing,User Interface,Jpanel,Layout Manager,我有一个看起来像window1的窗口,我希望它看起来像window2: btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS)); btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); btnPanel.add(Box.createHorizontalGlue()); btnPanel.setLayout(new BoxLayout(btn

我有一个看起来像window1的窗口,我希望它看起来像window2:

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());
这是我的代码:

    String q = "Have you used GUI before?";     
    JLabel textLabel2 = new JLabel(
        "<html><div style=\"text-align: center;\">" + q + "</html>", SwingConstants.CENTER);
    add(textLabel2, BorderLayout.NORTH);

    JPanel radioPanel = new JPanel();                                           
    add(radioPanel, BorderLayout.CENTER);

    JPanel btnPanel = new JPanel();
    add(btnPanel, BorderLayout.SOUTH);
btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());
这样按钮问题就解决了。
但是,仍然无法修复单选按钮

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());
--编辑2--
使用
setOpaque(false)修复了单选按钮的背景

你所说的“中断”是什么意思?作为网格布局,“是”和“否”的位置应该可以正常工作。我会通过
newgridlayout(0,1)
给它1列和2行(或者为可变数量的行设置0)。通过执行
radioPanel.setOpaque(false),确保其不透明属性设置为false。这样,它将显示它所在容器的背景色。我不确定,您可能还需要将JRadioButtons设置为非不透明

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());
您的btnPanel可以使用BoxLayout并使用Box.createGlue()将按钮推到右侧

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());

最重要的是——如果您还没有这样做,请阅读您可以找到的有关Swing布局管理器使用的教程。

您可以为此做几件事。你需要更换你的布局经理。对于BorderLayout来说,这不是一项伟大的任务。你可以做嵌套的BoxLayouts。具有垂直固定高度支柱、标签、垂直固定高度支柱、yes radio、垂直固定支柱、no radio、垂直胶水和最终按钮面板的垂直框。然后使用按钮面板中的编辑将它们水平对齐。这是一种选择,但是面板的嵌套很烦人

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());
另一个选择是获取TableLayout并学习如何使用它。TableLayout是最好的布局管理器之一。它易于使用,经过了严格的测试,让Swing再次充满乐趣。你再也不会使用GridBagLayout了

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());

btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());

最后一个选项是使用新的GroupLayout。我对它不太熟悉,但看起来很简单。而且,它不像Box那样需要太多的代码或嵌套不必要的面板。

对不起,我的意思是它们在垂直方向上彼此太长了。和
radioPanel.setBackground(彩色暗光)不再有任何效果。1)尽管GridLayout和Set不透明,我仍然会遇到同样的问题(太长和背景不同)。2) 我将立即检查此方法。3) 这些页面在我的Internet浏览器中是全天候打开的。@障碍:“太长”可以通过将radioPanel嵌套到另一个充当容器的JPanel中,或者使用FlowLayout,然后将容器JPanel添加到GUI中来修复。你必须发挥你的布局和调整的东西,他们的工作,如你所愿。好的,谢谢。这比我想象的要困难;)有没有一种方法可以像截图上那样为单选按钮设置相同的背景?@Barler:没有,这真的没有那么难,因为你添加的只是另一个包含JPanel的按钮。同样,让任何组件使用与其容器调用相同的背景
myComponent.setOpaque(false)在该组件上,正如我在上面的回答中所解释的。快速问题,我可以“合并”TableLayout中的单元格吗?您可以有一个跨多行和/或列的组件。谢谢,将在下一个窗口中使用该组件。
btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
btnPanel.add(Box.createHorizontalGlue());