在我的JFrame项目中,我的方法正在完成两次。是什么造成的?

时间:2016-09-28 01:56:28

标签: java swing jframe

头等舱

package com.mudd.render;

import java.awt.Dimension;

import javax.swing.JFrame;

import com.mudd.game.Game;




public class render {
    int width = 500;
    int height = 600;

    Game g = new Game();

    public void show(){
        JFrame gameWindow = new JFrame("..");


        gameWindow.setPreferredSize(new Dimension(width, height));

        //gameWindow.setIconImage(new ImageIcon(imgURL).getImage());


        gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        gameWindow.pack();

        gameWindow.add(g);

        gameWindow.setVisible(true);
    }



    public static void main(String[] args) {

        render game = new render();

        game.show();

    }

}

第二课

package com.mudd.game;

import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game extends JPanel {


    public void paint(Graphics g){

         g.fillOval(10, 10, 500, 500);

         System.out.println("Test");
        }

}

是什么导致我的Test print语句被打印两次?如果我添加其他priintlns,它也会打印出来。我一直在使用Head First Java学习Java,而且我已经完成了其他小型命令行项目,但我发生过这样的事情。

1 个答案:

答案 0 :(得分:2)

Swing图形是被动的 - 您不直接调用绘制方法,而是JVM调用它们。有时可能会在您的建议中调用它们,例如当您致电repaint()时,但即使这也不是保证,有时可能会根据平台的建议调用它们,例如确定您的应用程序具有需要清理的“脏”像素。因此,您必须为此计划 - 绘制方法不应包含更改对象状态的代码,也不应包含业务逻辑代码。相反,它应该有绘画的代码,仅此而已。

有关详细信息,请参阅:

侧面建议:

  • 覆盖JPanel的paintComponent方法,而不是其绘制方法
  • 使用@Override注释进行任何方法覆盖
  • 不要忘记在覆盖中调用super的方法。