我尝试过许多不同的方法,但我将解释两种方法以及发生了什么(没有错误消息或任何东西,只是没有显示出它们应该出现的样子,或者根本没有出现):
首先,我创建了一个名为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(新的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); 但是,在这个场景中,宽度占用了整个框架的宽度,而textfield (没有显示在代码片段中)基本上占用了其他所有内容。
下面是我尝试过的: setPreferredSize() & setSize()
还有什么是我遗漏的吗?谢谢。
我还应该指出,这是一个单独的类,在这个类中没有main。我这么说只是因为我扩展了JPanel而不是JFrame。我见过一些人扩展JFrame并使用JFrame,但我还没有尝试过。
发布于 2015-11-11 20:34:09
更新:
您不需要扩展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‘中)。
发布于 2015-11-11 21:06:20
下面是一个具有JPanel的BorderLayout示例,该示例将带有按钮和标签的JPanel添加到"North“
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);
}
}发布于 2015-11-11 20:35:03
下面的建议是假设您的扩展JFrame**.**是
测试
首先,在没有看到everything的情况下,您总是可以尝试大量的事情。
首先,在加载所有内容之后,尝试添加以下内容(同样,假设您的扩展 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.不过,有一件事是,你仍然可以添加你的JMenu和什么--不是通过你的JFrame,不是你的JPanel。
https://stackoverflow.com/questions/33659247
复制相似问题