我在开发一款Java 2d游戏时遇到了问题。
一些游戏屏幕元素是在覆盖paint()
方法的Jpanel
中绘制的,其他一些元素是Jlabels
添加到该面板上的。
问题是paint()
方法中绘制的元素始终是最新的(我从线程中每30毫秒回忆一个Jpanel.repaint()
),但Jlabels
通常不显示或以随机方式闪烁。
我已经搜索了很多,但无法找到一种方法来更新所有的元素在同一时间。
这是代码的核心结构:
主类
final class ATC_sim {
// ...
public CustomLabel[] label;
// CustomLabel is just a class in which are organized differents JLabels in
// a certain relative position.
// ...
private ATC_sim(){
initGui();
initGame();
}
private void initGui(){
frame = new JFrame();
pGame = new GamePanel(this);
for(int i=0; i< label.length; i++){
pGame.add(label[i]);
}
frame.add(pGame);
// ...
}
private void initGame(){
loop = new Loop(this, 30);
thread = new Thread(loop);
thread.start();
pGame.repaint();
}
// method recalled every 30ms from thread(loop)
public void updateGame(){
// do the math of the game (in which I also move the position of labels)
// ...
for(int i=0; i< label.length; i++){
label[i].update(); // this method update text in Jlabels and position of label.
}
pGame.repaint();
}
}
<<p>GamePanel类/strong>public class GamePanel extends JPanel {
// ...
public GamePanel(ATC_sim a) {
this.atc = a;
// ...
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
// do some drawings according to some variable calculated in updateGame()
}
}
首先,如果您想要更好的性能和更低的延迟/口吃机会,请使用paintImmediately()
而不是repaint()
。
这可能已经解决了你的问题。
第二部分是:你使用双缓冲吗?如果你使用这个,这个问题肯定会消失(在我看来)。