我一直在编写有关 Java 8 中 2D 图形的教程,当时 NetBeans 给了我一个提示:Thread.Sleep
会影响性能。然而,尽管我已经找到了几种更好的方法,但我还没有找到一种方法来包含它们而不弄乱代码。
package platformer;
import java.awt.*;
import javax.swing.*;
import java.util.Scanner;
@SuppressWarnings("serial")
public class Platformer extends JPanel {
int x = 0;//Sets the starting coords. of the ball
int y = 0;
private void moveBall() {//How much the ball moves by
x = x+1;
y = y+1;
}
@Override
public void paint(Graphics g) {//Essentially al the graphics functions
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fillOval(x, y, 30, 30);
}
public static void main(String[] args) throws InterruptedException {
Scanner reader = new Scanner(System.in);
Scanner reader1 = new Scanner(System.in);
System.out.print("Enter an x-value for the window (whole numbers only): ");
int setx = reader.nextInt();
System.out.print("Enter a y-value for the window (whole numbers only): ");
int sety = reader.nextInt();
JFrame gameFrame = new JFrame("Sample Frame");//Makes the window variable w/ the name in quotations.
Platformer game = new Platformer();//'Copies' the graphics functions above into a variable
gameFrame.add(game);//Adds the above variable into th window
gameFrame.setSize(setx,sety);//Sets the resolution/size of the window(x,y)
gameFrame.setVisible(true);//Makse the window visible
gameFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//Makes the window close when the close button is hit
while (true){
game.moveBall();
game.repaint();
Thread.sleep(10);
}
}
}
我想知道如何包含一种更好的方法来使线程在循环中休眠,或者使 NetBeans 只执行循环。
虽然我已经找到了几种更好的方法
好吧,您不认为您应该告诉我们您发现的方法,这样我们就不会花时间提出您已经知道的建议吗?我们不是读心术的人,我们无法猜测您尝试过什么。
我一直无法找到一种方法来包含它们而不弄乱代码。
好吧,无论如何你的代码应该重新设计。
代码的动画应该是游戏面板的函数,而不是 main() 方法。所以你应该有类似的方法startGame()
and stopGame()
内置于您可以调用的面板中。
Netbeans 给了我一个提示,执行 thread.sleep 会影响性能。
是的,一般来说,您不应该使用 Thread.sleep(),因为通常代码是作为某些用户操作的结果而执行的,并且代码在Event Dispatch Thread (EDT)
。由于 EDT 负责绘制 GUI,如果您不断告诉它休眠,那么这显然会影响性能。
但是,在您的情况下,循环逻辑不会在 EDT 上执行,因此它不应该成为问题(总体设计问题除外)。
实际上你不应该使用循环。相反,你应该使用摇摆计时器 http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html安排动画。
另请查看教程中的部分Concurrency in Swing
这将解释更多关于EDT
以及为什么 Swing 组件应该在EDT
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)