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);
}
}
我已经尝试了很多不同的方法,但我将解释其中两种以及发生了什么(没有错误消息或任何东西,只是没有按应有的方式出现或根本没有出现):
首先,我创建了一个名为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);
}
}