在我的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语句被打印两次?如果我添加其他prinintlns,它也会把它们都打印出来。我一直在Head First Java学习Java,我也做过其他小的命令行项目,但从来没有发生过这样的事情。

Swing图形是被动的——您自己不直接调用绘制方法,而是由JVM调用它们。它们有时可能在您的建议下被调用,例如当您调用repaint()时,但即使这也不能保证,它们有时可能在平台的建议下被调用,例如当它确定您的应用程序有需要清理的"脏"像素时。因此,您必须为此进行规划——绘制方法不应包含改变对象状态的代码,也不应包含业务逻辑代码。相反,它应该有用于绘画的代码,而不是其他代码。

关于这方面的详细信息,请参见:

  • 课程:执行自定义绘画:Swing图形入门教程
  • 在AWT和Swing中绘画:Swing图形高级教程

方面建议:

  • 重写JPanel的paintComponent方法,而不是它的paint方法
  • 为任何方法重写使用@Override注释
  • 不要忘记在你的override中调用super的方法。

最新更新