Java - 像在 JFrame 中一样在 JPanel 中放置项目
Java - placing items in JPanel like in JFrame
我尝试做一些简单的游戏,由几个 'screens'(菜单、选项等)组成,它可以通过显示和隐藏几个 JPanels 来工作。当我在每个面板上添加一些东西并运行程序时,唯一出现的是空 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);
}}
所有必需的东西都已导入和声明,它只是 'simpled' 版本。怎么了?
一些事情:
- 使用类名 Frame 可能会与 java.awt.Frame 冲突。
- 您必须通过调用
frame.setVisible(true);
来设置框架可见在此之前,调用 frame.pack();
- 您正在对 JFrame 进行子类化,但也声明并准备了一个不同的 JFrame。消除其中之一。
- 将组件添加到 JFrame 的内容窗格:frame.getContentPane().add(subcomponent);
在添加元素后设置布局管理器和打包应该可以解决这个问题。也不清楚为什么在构造 this
时要引用 frame
。试试这个版本:
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);
}
}
JFrame
默认使用 BorderLayout
,这意味着只有一个组件可以占据 BorderLayout
经理的五个可用职位中的每一个。
默认情况下,如果您不指定组件的位置,它将被添加到CENTRE
位置
您应该将 UI 分解为逻辑单元并使用 JPanel
来管理它们
您可以结合使用面板和布局来生成复杂的 UI
您还应该考虑使用 CardLayout
来允许您在基本视图之间切换
你还应该在 JFrame
最后调用 setVisible,在你建立了基本的 UI 之后,否则你需要调用 revalidate
和 repaint
更新 UI
您应该避免在组件上使用 setBounds
/setSize
/setLocation
并依赖布局管理器的使用,因为它们旨在管理渲染管道中出现的差异跨多个不同的操作系统和硬件平台
我尝试做一些简单的游戏,由几个 'screens'(菜单、选项等)组成,它可以通过显示和隐藏几个 JPanels 来工作。当我在每个面板上添加一些东西并运行程序时,唯一出现的是空 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);
}}
所有必需的东西都已导入和声明,它只是 'simpled' 版本。怎么了?
一些事情:
- 使用类名 Frame 可能会与 java.awt.Frame 冲突。
- 您必须通过调用
frame.setVisible(true);
来设置框架可见在此之前,调用frame.pack();
- 您正在对 JFrame 进行子类化,但也声明并准备了一个不同的 JFrame。消除其中之一。
- 将组件添加到 JFrame 的内容窗格:frame.getContentPane().add(subcomponent);
在添加元素后设置布局管理器和打包应该可以解决这个问题。也不清楚为什么在构造 this
时要引用 frame
。试试这个版本:
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);
}
}
JFrame
默认使用 BorderLayout
,这意味着只有一个组件可以占据 BorderLayout
经理的五个可用职位中的每一个。
默认情况下,如果您不指定组件的位置,它将被添加到CENTRE
位置
您应该将 UI 分解为逻辑单元并使用 JPanel
来管理它们
您可以结合使用面板和布局来生成复杂的 UI
您还应该考虑使用 CardLayout
来允许您在基本视图之间切换
你还应该在 JFrame
最后调用 setVisible,在你建立了基本的 UI 之后,否则你需要调用 revalidate
和 repaint
更新 UI
您应该避免在组件上使用 setBounds
/setSize
/setLocation
并依赖布局管理器的使用,因为它们旨在管理渲染管道中出现的差异跨多个不同的操作系统和硬件平台