簡體   English   中英

我如何使方法在計時器中起作用?

[英]How i can make method works in Timer?

我創建了 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

創建計時器並在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");
      }

    });
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM