在Java Swing中移动块时遇到卡顿。
下面的代码将显示该问题。运行时,我希望盒子移动得顺畅,没有任何卡顿。在Swing中有什么方法可以做到这一点吗?或者我应该直接转到JavaFX?
MovementStutter.java
package movementstutter;
import javax.swing.JFrame;
public class MovementStutter {
public static void main(String[] args) {
JFrame win = new JFrame("Stutter Demo");
win.getContentPane().add(new GamePanel());
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setResizable(false);
win.pack();
win.setVisible(true);
}
}
GamePanel.java
package movementstutter;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable {
private boolean running;
private Thread thread;
private double x;
private double y;
private double movementFactor;
public GamePanel() {
setPreferredSize(new Dimension(640, 480));
setFocusable(true);
grabFocus();
movementFactor = 1;
running = true;
}
@Override
public void addNotify() {
super.addNotify();
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
@Override
public void run() {
long time = System.currentTimeMillis();
while (running) {
update();
repaint();
long sleep = 16 - (System.currentTimeMillis() - time);
time += 16;
if (sleep < 0) {
sleep = 16;
}
try {
Thread.sleep(sleep);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void update() {
if (x < 0) {
movementFactor = 1;
} else if (x > 608) {
movementFactor = -1;
}
x += movementFactor * 200 * 0.016;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect((int) x, (int) y, 32, 32);
}
}
https://stackoverflow.com/questions/29715049
复制相似问题