Java Swing paint () Дважды Показать один раз, когда на весь экран - PullRequest
0 голосов
/ 30 апреля 2019

Я делаю небольшую игру, используя 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);
    }
}

1 Ответ

0 голосов
/ 30 апреля 2019

ОК, поэтому проблема в том, что я не должен помещать ничего, что обновляет состояние игры, в paint(). Java вызывает это при необходимости. Благодаря @ Эндрю Томпсон.

Некоторые другие ошибки, улучшения и документация:

1) Документация - JComponent - paint () : вызывается Swing для рисования компонентов. ... Подкласс, который просто хочет специализировать метод рисования делегата UI (внешний вид), должен просто переопределить paintComponent.

2) Документация - Шрифт - SERIF : Строковая константа для канонического имени семейства логического шрифта "Serif". В конструкции Font полезно обеспечить проверку имени во время компиляции.

3) Оракул - о живописи

4) Документация - Graphics - dispose () : Для эффективности программисты должны вызывать dispose по завершении, используя объект Graphics, только если он был создан непосредственно из компонента или другого объекта Graphics.

5) Учебник по Java-играм на Youtube : Плохой пример! НЕ используйте paint() и g.dispose() здесь !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...