Java中BorderLayout()的问题
我尝试了很多不同的方法,但我将解释其中两种方法以及发生了什么(没有错误消息或任何事情,只是没有像他们应该的那样出现,或者根本没有出现): 首先,我创建了一个名为layout的JPanel,并将其设置为BorderLayout。下面是我制作它的一个片段:Java中BorderLayout()的问题,java,swing,jframe,jpanel,border-layout,Java,Swing,Jframe,Jpanel,Border Layout,我尝试了很多不同的方法,但我将解释其中两种方法以及发生了什么(没有错误消息或任何事情,只是没有像他们应该的那样出现,或者根本没有出现): 首先,我创建了一个名为layout的JPanel,并将其设置为BorderLayout。下面是我制作它的一个片段: JPanel layout = new JPanel(); layout.setLayout(new BorderLayout()); colorChoice = new JLabel("Choose your color: "); layou
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(newborderlayout());下面是该代码的一个片段:
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()
我还缺什么吗?多谢各位
我还应该注意,这是一个单独的类,在这个类中没有main。我之所以这样说,是因为我扩展了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);
}
}
请注意,在这两种情况下,当我向面板添加某些内容时,我选择了不同的布局参数(一个标签我放在“北”中,另一个放在“南”)
更新: 您不需要扩展
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);
}
}
请注意,在这两种情况下,当我向面板添加某些内容时,我选择了不同的布局参数(一个标签我放在“北”中,另一个放在“南”)。下面的建议是假设您的扩展
JFrame
测试
首先,在看不到所有东西的情况下,你总是可以尝试很多东西
首先,在加载所有内容后,尝试将其添加到中(再次,假设您的扩展JFrame
:
revalidate();
repaint();
我一直将其添加到我自己的Swing项目中,因为它会刷新和检查,以确保所有内容都在框架上
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);
}
}
如果这不起作用,请确保所有的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.
但是有一件事,您仍然添加了
JMenu
,而不是通过JFrame
,而不是JPanel以下建议是假设您的扩展JFrame
测试
首先,在看不到所有东西的情况下,你总是可以尝试很多东西
首先,在加载所有内容后,尝试将其添加到中(再次,假设您的扩展JFrame
:
revalidate();
repaint();
我一直将其添加到我自己的Swing项目中,因为它会刷新和检查,以确保所有内容都在框架上
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);
}
}
如果这不起作用,请确保所有的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.
但是有一件事,你仍然添加你的JMenu
,而不是通过你的JFrame
,而不是你的JPanel
这里是一个JPanel
的例子,它有一个边框布局,在“北”添加一个带有按钮和标签的JPanel
下面是一个带有边框布局的JPanel
示例,该布局将带有按钮和标签的JPanel
添加到“北”
PS:不会从另一个答案中窃取,因为它也包含一个有效的建议,请尝试修复您的BorderLayout
的协调。仅供参考:validate
实际上不是一个解决方案,除非容器已经被invalidate
,这在添加/删除组件时通常不会发生。相反,您应该这样做使用revalidate
,但你最好有一个很好的理由;)我知道它的用途,但我不知道为什么要使用它,但由于一些愚蠢的原因,当我使用Java 1.6时,每次使用repaint()时
在我的Mac电脑上,什么都不会发生。使用两者,它都可以工作…0\u 0通常的模式是调用invalidiate
,validate
和repaint
。第一种模式将容器层次结构标记为“无效”并要求