Почему этот овал движется так быстро? - PullRequest
1 голос
/ 04 июня 2019

Я изучаю Java, и я пытался создать приложение, которое бросает мяч, когда я нажимаю на панель. Проблема в том, что когда овал закрашен, он движется так быстро, что даже если установить значение Thread.sleep на максимальное значение, это едва заметно. Как я могу замедлить его?

public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.red);
        g2.drawOval(x,y,20,20);

        Thread thread = new Thread() {
            public void run() {
              while (true) {
                y = y + 1;
                repaint();
                try {
                  Thread.sleep(2147483647);
                } 
                catch (InterruptedException ex) {
                }
              }
            }
          };
          thread.start();
    }

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Я не пробовал вашу программу в моем собственном окружении, но из того, что я знаю, кажется, что то, что движет вашим мячом, это строка:

y = y + 1; 

, поэтому вы, вероятно, могли бы рассмотреть возможность изменить это наменьшее число, скорее всего, двойное.Кроме того, как уже упоминалось, возможно, вы можете попробовать не использовать оператор:

while (true)

, поскольку это всегда и всегда будет принимать значение true, и это не самая большая проблема, но, возможно, вы можете подумать об использованиичто-то еще, например, использование чего-то, что связано с переменной y, например: while (y < 768 ), или даже что-то вроде цикла for, в зависимости от того, что вы делаете.

Надеюсь, это поможет, и я бы посоветовал вам взглянуть на этот ответ здесь: Обновление графики Java слишком быстрое

Желаю вам всего наилучшего!

0 голосов
/ 05 июня 2019
  • Избавьтесь от создания потока в методе paintComponent.

  • Вам необходимо использовать java Swing Timer с actonListener до
    увеличить координаты x и y и затем вызвать repaint().Подробности смотрите в API Java.

  • При запуске программы используйте SwingUtilities.invokeLater(()->new className()) для вызова класса.Это планирует приложение в очереди для обработки в потоке диспетчеризации событий (EDT).Все события и перерисовки необходимо обрабатывать в EDT.

  • В вашем методе paintComponent установите сглаживание с помощью Graphics2D через setRenderingHints.Это также объясняется в Java API.Усреднение краев сделает вашу графику более гладкой.

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