1

这是我的JPanel。第一个按钮始终可见,但只有在您将光标放在第二个按钮上时才能看到第二个按钮。问题可能出在哪里?

PS如果可以的话,请使用简单的英语,因为我英语说得不好

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);
    }
}
4

2 回答 2

5
  1. 不要使用空布局
  2. 不要在绘画方法中创建组件。paint() 方法仅用于自定义绘画。您无需重写paint() 方法。

阅读 Swing 教程如何使用 FlowLayout中的部分,了解使用按钮和布局管理器的简单示例。

于 2014-04-11T20:44:14.977 回答
5

如果您想避免问题并正确学习 Java Swing,请在此处查看他们的教程。

这里要讨论的问题太多了,所以我会尽量保持简单。

  1. 您正在使用null布局。null大多数情况下避免使用布局,因为通常有一个布局可以完全满足您的需求。让它工作需要一些时间,但本教程中有一些默认值使用起来相当简单。那里有一些不错的图片,向您展示了每种布局可以做什么。如果您使用布局管理器,通常不需要在大多数组件(如 JButtons)上使用setLocation, setSize或。setVisible

  2. paint在 Swing 应用程序中调用该方法。您想打电话paintComponent是因为您使用的是 Swing 而不是 Awt。您还需要在super.paintComponent(g)方法的第一行调用该方法paintComponent,以便正确覆盖另一个paintComponent方法。

  3. paint/相关的paintComponent方法经常被调用。您不想在其中创建/初始化对象。paint/paintComponent方法不像听起来那样是一次性的方法。他们不断被调用,你应该围绕这个设计你的 GUI。将您的paint-related 方法设计为事件驱动而不是顺序的。换句话说,以您的 GUI 对事物持续做出反应的心态来编写方法,而不是像普通程序paintComponent那样按顺序运行。这是一种非常基本的方法,希望不会让您感到困惑,但是如果您查看该教程,您最终会明白我的意思。

Java中有两种基本类型的GUI。一个是Swing,另一个是Awt。在 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

        }
    }

}
于 2014-04-11T20:50:25.207 回答