Java 中的 BorderLayout() 问题

Problems with BorderLayout() in Java

我已经尝试了很多不同的方法,但我将解释其中两种以及发生了什么(没有错误消息或任何东西,只是没有按应有的方式出现或根本没有出现):

首先,我创建了一个名为layout 的JPanel 并将其设置为BorderLayout。这是我制作它的样子的片段:

JPanel layout = new JPanel();
layout.setLayout(new BorderLayout());

colorChoice = new JLabel("Choose your color: ");
layout.add(colorChoice, BorderLayout.NORTH);

colorBox = new JComboBox(fireworkColors);
colorBox.addActionListener(this);
layout.add(colorBox, BorderLayout.NORTH);

在这种情况下,他们根本不会出现。它只是继续我添加的任何其他内容。

然后我就尝试了 setLayout(new BorderLayout());这是该代码的片段:

    setLayout(new BorderLayout());
    colorChoice = new JLabel("Choose your color: ");
    add(colorChoice, BorderLayout.NORTH);

    colorBox = new JComboBox(fireworkColors);
    colorBox.addActionListener(this);
    add(colorBox, BorderLayout.NORTH); 

在这种情况下,它们被添加了,但是,宽度占据了框架的整个宽度,文本字段(代码段中未显示)基本上占据了其他所有内容。

这是我尝试过的: setPreferredSize() & setSize()

还有什么我想念的吗?谢谢。

我还应该注意,这是一个单独的 class,并且在这个 class 中没有主线。我之所以这样说,是因为我扩展了 JPanel 而不是 JFrame。我看到有人扩展 JFrame 并使用 JFrame,但我还没有尝试过。

  • 您创建了一个 JPanel,但没有将它添加到任何容器中。在将它添加到某些东西(JFrame,或位于层次结构上方某处的框架中的另一个面板)之前,它是不可见的
  • 您将两个组件添加到 BorderLayout 中的同一位置。最后添加的就是那个位置的。

更新:

您不需要延长 JFrame。我从不这样做,而是总是扩展 JPanel。这使我的自定义组件更加灵活:它们可以添加到另一个面板中,也可以添加到框架中。

所以,为了演示这个问题,我将制作一个完整的小程序:

public class BadGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.setVisible(true);
        }
    }

在这个程序中,我创建了一个面板,但没有将它添加到任何东西,所以它永远不会可见。

在下一个程序中,我将通过将面板添加到框架来修复它。

public class FixedGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.getContentPane().add(panel);
        frame.setVisible(true);
        }
    }

请注意,在这两个中,当我向面板添加内容时,我选择了不同的布局参数(一个标签我放在 'North' 中,另一个在 'South' 中)。

以下建议假设您扩展 JFrame.

测试

首先,在没有看到一切的情况下,总有很多事情可以尝试。

首先,加载所有内容后,尝试将其添加到(再次,假设您扩展 JFrame:

revalidate();
repaint();

我一直将它添加到我自己的 Swing 项目中,因为它会刷新并检查框架上的所有内容。

如果这不起作用,请确保将您所有的 JComponent 添加到您的 JPanel,并且只有您的 JPanel 在您的 JFrame 上.您的 JFrame 无法解决所有问题; JPanel 做到了。

JPanel window = new JPanel();
JButton button = new JButton("Press me");    

add(window);
window.add(button); // Notice how it's the JPanel that holds my components.

不过有一件事,您仍然通过 JFrame 添加 JMenu 和其他东西,而不是 JPanel

这里是一个 JPanel 的示例,它带有一个 BorderLayout,它向 "North"

添加了一个带有按钮和标签的 JPanel
public class Frames extends JFrame
{
    public Frames()
    {
        JPanel homePanel = new JPanel(new BorderLayout());
        JPanel northContainerPanel = new JPanel(new FlowLayout());

        JButton yourBtn = new JButton("I Do Nothing");
        JLabel yourLabel = new JLabel("I Say Stuff");

        homePanel.add(northContainerPanel, BorderLayout.NORTH);

        northContainerPanel.add(yourBtn);
        northContainerPanel.add(yourLabel);

        add(homePanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setTitle("Cool Stuff");
        pack();
        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(Frames::new);
    }
}