Как я могу сделать метод работает в таймер? - PullRequest
0 голосов
/ 31 января 2019

Я создал метод draw (), который рисует значение переменной z на экране.Таймер должен увеличивать z и вызывать draw () каждый раз, но draw () работает только вне таймера.У меня нет ошибок в консоли.Есть идеи?Вот мой код:

public class New extends JFrame{

    MyComponent komponent;
    int z=1;
    Timer timer;

    class MyComponent extends JComponent{

        @Override
        protected void paintComponent(Graphics g2){
            Graphics2D g = (Graphics2D)g2;
            RenderingHints rh = new RenderingHints(
                     RenderingHints.KEY_ANTIALIASING,
                     RenderingHints.VALUE_ANTIALIAS_ON);
            g.setRenderingHints(rh);

            timer=new Timer(50,new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    draw(g); //doesn't work
                    z++;
                }
            });
            timer.start();
            draw(g); //works

        }
        private void draw(Graphics2D g){
            Font myFont = new Font ("Courier New", 1, 30);
            g.setFont(myFont);
            g.setColor(Color.BLACK);
            g.drawString(Integer.toString(z),0,30);
        }
    }

и весь код: https://pastebin.com/mH2u9YVr

1 Ответ

0 голосов
/ 31 января 2019

Создание таймера и запуск его внутри paintComponent() - проблема.paintComponent() - это метод, который вызывается очень часто.Итак, ваш timer создается много раз снова и снова.

Вам нужно создать таймер и запустить его только один раз.

Я получил ваш полный код и внес несколько изменений.Я думаю, что теперь это работает.Смотрите мои комментарии в коде.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class New extends JFrame{

  MyComponent komponent;
  int z=1;
  Timer timer;

  class MyComponent extends JComponent{

    @Override
    protected void paintComponent(Graphics g2){
      Graphics2D g = (Graphics2D)g2;
      RenderingHints rh = new RenderingHints(
          RenderingHints.KEY_ANTIALIASING,
          RenderingHints.VALUE_ANTIALIAS_ON);
      g.setRenderingHints(rh);

      //Prasad: Removed the timer from here

      draw(g);

    }
    private void draw(Graphics2D g){
      Font myFont = new Font ("Courier New", 1, 30);
      g.setFont(myFont);
      g.setColor(Color.BLACK);
      g.drawString(Integer.toString(z),0,30);
    }
  }

  public New(String string) {
    super(string);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Toolkit kit=Toolkit.getDefaultToolkit();
    Dimension d=kit.getScreenSize();
    setBounds(d.width/4, d.height/4, d.width/2, d.height/2);
    add(komponent=new MyComponent());

    //Prasad: Moved the timer here
    timer=new Timer(500,new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        komponent.repaint(); //Prasad: Just call repaint()
        z++;
      }
    });
    timer.start();

    setVisible(true);
  }

  public static void main(String[] args){
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        new New("New");
      }

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