Почему Java Graphics2D 'drawString' останавливает repaint ()? - PullRequest
0 голосов
/ 26 декабря 2018

Я сейчас нахожусь в процессе создания игры с Java Swing.Мне нужен счетчик очков, поэтому я использую метод Graphics2D drawString, чтобы нарисовать его.

Я удалил все, что не меняет проблему в моем коде, и в конце концов я обнаружил, что проблема былаdrawString метод.

Это мой полный код: (Problem / src / defaultpackage / Problem.java)

// All the imports are here
public class Problem extends JPanel {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Problem problem = new Problem();
        frame.add(problem);

        frame.setTitle("Problem");
        frame.setSize(350, 720);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.requestFocus();
        frame.setVisible(true);
    }
    public Problem() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new ScheduleTask(),0,20);
        // Changing '20' doesn't work
    }
    private void draw(Graphics g) {
        System.out.println("draw");
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawString("S", 100, 100);
        // If I remove this and replace it by:
        //g2d.fillRect(0, 0, 100, 100);
        // it works just fine
    }
    @Override
    public void paintComponent(Graphics g) {
        System.out.println("paintcomponent");
        super.paintComponent(g);
        draw(g);
    }
    private class ScheduleTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("repaint");
            repaint();
        }
    }
} 

Я ожидаю, что результат будет:

repaint
paintcomponent
draw
repaint
paintcomponent
draw

и так далее.Но вместо этого, в течение первых двух секунд, в течение которых работает программа, вывод будет просто:

repaint
repaint
repaint

И через эти две секунды все будет работать, как ожидалось.

Почему это произошло?

1 Ответ

0 голосов
/ 26 декабря 2018

Поскольку таймер работает 50 раз в секунду, он запускается много раз, прежде чем основной поток завершает инициализацию GUI.

Вызов repaint() до готовности GUI не вызывает вызова paintComponent().

Если вы не запустите таймер до тех пор, пока не будет вызван setVisible(true), вы получите то, что ожидали.

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