Java - 将项目放在JPanel中,就像在JFrame中一样

时间:2015-01-01 21:21:28

标签: java swing jframe jpanel

我尝试做一些简单的游戏,由少数几个屏幕组成。 (菜单,选项等),可以通过显示和隐藏几个JPanel来工作。当我在每个面板上添加一些东西并运行程序时,唯一出现的是空JFrame。我的ID看起来像这样:

public class Frame extends JFrame{
JPanel panel1 = new JPanel();
JFrame frame = new JFrame("halo");
JButton button = new Button();
int WIDTH=600,HEIGHT=600;

public Frame(){

frame.add(game);
frame.setSize(WIDTH, HEIGHT);
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(panel1);
panel1.setBounds(0,0,WIDTH,HEIGHT)
panel1.add(button);
button.setBounds(10,10,30,30);
}}

所有重要的东西都是进口和宣传的,它只是简单的'版。它有什么问题?

3 个答案:

答案 0 :(得分:4)

一些事情:

  • 使用classname Frame可能与java.awt.Frame冲突。
  • 您必须通过调用frame.setVisible(true);来设置框架可见之前,请致电frame.pack();
  • 您正在继承JFrame,但也声明并准备了另一个JFrame。消除其中一个。
  • 将组件添加到JFrame的内容窗格中:frame.getContentPane()。add(subcomponent);

答案 1 :(得分:1)

添加元素后设置布局管理器和打包应解决问题。此外,当您构建frame时,您还不清楚为什么要引用this。试试这个版本:

public class Frame extends JFrame{
    JPanel panel1 = new JPanel();
    JButton button = new Button();
    int WIDTH=600,HEIGHT=600;

    public Frame(){
    setTitle("Halo");
    setLayout(new BorderLayout());
    add(panel1, BorderLayout.CENTER);

    panel1.setBounds(0,0,WIDTH,HEIGHT);
    panel1.setLayout(new BorderLayout());
    panel1.add(button, BorderLayout.SOUTH);
    button.setBounds(10,10,30,30);

    pack();
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

答案 2 :(得分:1)

默认情况下,

JFrame使用BorderLayout,这意味着只有一个组件可以占据BorderLayout个管理员的五个可用位置。

默认情况下,如果您没有指定组件的位置,则会将其添加到CENTRE位置

您应该将UI分解为逻辑单元,并使用JPanel来管理它们

您可以使用面板和布局的组合来生成复杂的UI

您还应该考虑使用CardLayout来允许您在基本视图之间切换

在您建立基本用户界面后,您还应该在JFrame上调用setVisible,否则您需要拨打revalidaterepaint来更新UI

您应该避免在组件上使用setBounds / setSize / setLocation并依赖布局管理器的使用,因为它们旨在管理在多个组件中发生的渲染管道的差异不同的操作系统和硬件平台