这是我的JPanel
。第一个按钮总是可见的,但第二个按钮只有当你在上面放了一个cursour时才可见。问题出在哪里?
第页。S.如果可以的话,请用简单的英语,因为我的英语说得不好
public class GamePanel extends JPanel implements KeyListener{
GamePanel(){
setLayout(null);
}
public void paint(Graphics g){
JButton buttonShip1 = new JButton();
buttonShip1.setLocation(10, 45);
buttonShip1.setSize(40, 40);
buttonShip1.setVisible(true);
add(buttonShip1);
JButton buttonShip2 = new JButton();
buttonShip2.setLocation(110, 145);
buttonShip2.setSize(440, 440);
buttonShip2.setVisible(true);
add(buttonShip2);
}
}
如果你想避免问题并正确学习JavaSwing,请在这里查看他们的教程。
这里有太多的问题要讨论,所以我尽量保持简单。
-
您使用的是
null
布局。null
布局在很大程度上是避免的,因为通常有一个布局可以满足您的需求。它需要一些时间才能正常工作,但本教程中有一些默认值使用起来相当简单。那里有一些不错的图片,向你展示了你可以对每种布局做些什么。如果使用布局管理器,通常不需要在JButtons等大多数组件上使用setLocation, setSize
或setVisible
。 -
您正在Swing应用程序中调用
paint
方法。您之所以要调用paintComponent
,是因为您使用的是Swing而不是Awt。您还需要在paintComponent
方法的第一行调用super.paintComponent(g)
方法,以便正确覆盖其他paintComponent
方法。 -
与
paint
/paintComponent
相关的方法经常被调用。您不希望在其中创建/初始化对象。paint
/paintComponent
方法并不像听起来那样是一次性方法。它们不断被调用,您应该围绕这一点来设计GUI。将与paint
相关的方法设计为事件驱动,而不是顺序。换句话说,编程paintComponent
方法的心态是,GUI对事物的反应是连续的,而不是像正常程序那样按顺序运行这是一个非常基本的方法,希望不会让你感到困惑,但如果你去看看教程,你最终会明白我的意思。
Java中有两种基本类型的GUI。一个是Swing
和另一个是CCD_ 18。在stackoverflow上查看此答案对两人的描述很好。
下面是一个JPanel上的两个按钮的示例。
public class Test
{
public static void main(String[] args)
{
JFrame jframe = new JFrame();
GamePanel gp = new GamePanel();
jframe.setContentPane(gp);
jframe.setVisible(true);
jframe.setSize(500,500);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static class GamePanel extends JPanel{
GamePanel() {
JButton buttonShip1 = new JButton("Button number 1");
JButton buttonShip2 = new JButton("Button number 2");
add(buttonShip1);
add(buttonShip2);
//setLayout(null);
//if you don't use a layout manager and don't set it to null
//it will automatically set it to a FlowLayout.
}
public void paintComponent(Graphics g){
super.paintComponent(g);
// ... add stuff here later
// when you've read more about Swing and
// painting in Swing applications
}
}
}
- 不要使用空布局
- 不要在绘制方法中创建零部件。paint()方法仅用于自定义绘制。您不需要重写paint()方法
阅读Swing教程如何使用FlowLayout中的一节,了解一个使用按钮和布局管理器的简单示例。