Я делаю небольшую игру, используя Java Swing. Класс Game
расширяет JPanel
и реализует ActionListener
, a Timer
в нем вызывает repaint()
для обновления экрана, затем создает JFrame
и добавляет к нему Game
.
Тогда я заметил, что когда я делаю окно на весь экран, экран обновляется один раз, когда paint()
вызывается дважды. Это странно Любая помощь будет оценена.
Вот SSCCE, в примере создается переменная count
, а затем счетчик краски count+=1;
в repaint()
. Когда не полный экран, он показывает 0 1 2 3 4
... Когда полный экран, он показывает 4 6 8 10
...
Пример кода здесь:
package test.swing.FullScreenDropFrameRate;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
class Game extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private int count = 0;
public Game() {
new Timer(1000, this).start();
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
public void paint(Graphics g) {
// bg
g.setColor(Color.black);
g.fillRect(0, 0, getSize().width, getSize().height);
// info string
g.setColor(Color.white);
g.setFont(new Font("serif", Font.BOLD, 30));
g.drawString(""+count, 0, 30);
count += 1;
g.dispose();
}
}
public class TestFullScreenFrameRate {
public static void main(String[] args) {
JFrame jf = new JFrame("Snake");
jf.setBounds(100, 35, 800, 600); // x, y, width, height
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(new Game());
jf.setVisible(true);
}
}