第一类
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的方法。