Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何使该方法在计时器中工作?_Java_Swing_Timer - Fatal编程技术网

Java 我如何使该方法在计时器中工作?

Java 我如何使该方法在计时器中工作?,java,swing,timer,Java,Swing,Timer,我创建了draw()方法,在屏幕上绘制变量z的值。计时器应该每次增加z并调用draw(),但draw()只在计时器之外工作。我在控制台中没有错误。有什么想法吗? 这是我的密码: public class New extends JFrame{ MyComponent komponent; int z=1; Timer timer; class MyComponent extends JComponent{ @Override

我创建了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);
        }
    }
和整个代码:

问题在于创建计时器并在
paintComponent()内部启动它
paintComponent()
是一种被频繁调用的方法。因此,您的
计时器将被多次创建

您需要创建计时器并只启动一次

我得到了你的完整代码,并做了一些更改。我想现在它起作用了。在代码中也可以看到我的注释

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");
      }

    });
  }
}

如何运行该代码?请提供一个请提供一个调用
paintComponent()
的代码简单地说,Swing不是线程安全的,启动一个新线程(计时器就是这样做的)并从中调用draw将不起作用。你们想完成的是什么?我想在画布上画点东西,在下一个计时器勾选中,我想在上一个画布上画点东西,依此类推。类似于photoshop中的图层。这是我以前版本的代码,但这次我需要在以前的画布上绘制一些东西。我在我的问题下的评论中提到了这一点。我只想一直在第一块画布上画画。不过还是要谢谢你。@kapsztat12,如果你想要多层,你必须在框架中添加多个
MyComponent
组件。@kapsztat12,我从你在问题中给出的“全部代码”链接中得到了你的代码。如果您的代码现在不一样,请在那里更新。(或至少从问题中删除链接)