Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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_Animation_Time_Line - Fatal编程技术网

Java 停止已设置动画的抽绳并开始新的抽绳

Java 停止已设置动画的抽绳并开始新的抽绳,java,swing,animation,time,line,Java,Swing,Animation,Time,Line,编辑:这是完整的代码。在执行每个操作之后,我需要在执行repain()之前更改x1、y1、x2、y2和t的值。有没有一个简单的方法可以做到这一点?我只学过一门Java的基础课,所以尽量保持初级水平 import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Line { public static void main(String[] args) { java.awt.EventQ

编辑:这是完整的代码。在执行每个操作之后,我需要在执行repain()之前更改x1、y1、x2、y2和t的值。有没有一个简单的方法可以做到这一点?我只学过一门Java的基础课,所以尽量保持初级水平

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

public class Line {

  public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
        frame.add(new DrawLine(0,0,0,0));
        frame.setSize(500,500);
        frame.setVisible(true);  
      }
    });  
  } 
}

class DrawLine extends JPanel implements ActionListener {

  int x1;
  int y1;
  int x2;
  int y2;
  int i=100;
  int j=50;
  int t=1000;
  Timer time = new Timer(t, (ActionListener) this);

  public DrawLine(int x1, int y1, int x2, int y2) {
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    time.start();
  }

  public void animateLine(Graphics2D g) {
    g.drawLine(x1,y1,x2,y2);
  }

  public void actionPerformed(ActionEvent arg0) {
    x2=x2+i;
    y2=y2+j;
    time.stop();
    time.start();
    repaint();
  }

  public void paintComponent(Graphics newG) {
    super.paintComponent(newG);
    Graphics2D g2d = (Graphics2D)newG;
    animateLine(g2d);
  }
}

我建议你用两个组件来画线,动态和静态。动态组件是正在设置动画的线条,为此,您应该使用JPanel的paintComponent方法进行绘制。一旦那条线被完全画出来,那么它应该被更永久地画在BuffereImage上,它代表图像的静态部分,也在paintComponent中绘制。paintComponent的外观可能如下所示:

@Override
protected void paintComponent(Graphics g) {

    super. paintComponent(g);

    // here convert g to Graphics2D and set rendering hints
    // to smooth the line via anti-aliasing

    if (bufferedImg != null) {
        g.drawImage(bufferedImg, 0, 0, null);
    }
    // a boolean check
    if (drawingLine) {
        g.drawLine(x1,y1,x2,y2);
    }
}
然后,在计时器的actionListener中,您需要满足以下条件:

  • 可以确定绘制当前线的时间,如果不绘制,则可以延伸此线
  • 如果是,则将当前行绘制到BuffereImage
  • 然后启动新行,如果程序逻辑指示应该发生这种情况
例如

@Override
public void actionPerformed(ActionEvent e) {

    if (lineJustNowCompleted) {
        drawLineToBufferedImage();
    } else if (stillDrawingLine) {
        incrementLineEndPoints();
    } 
    repaint();

}

当然,麻烦在于细节,如果您仍然需要帮助,您需要提供这些细节和更多代码,最好是MCVE。

1)使用逻辑一致的缩进代码行和代码块形式。缩进的目的是使代码的流程更易于遵循!2) 为了更快地获得更好的帮助,可以发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。3)
time.stop()(是如何停止动画)。可能的建议:将动画线绘制到JPanel的paintComponent方法覆盖(未显示),并将完成的线绘制到同样在paintComponent中绘制的BuffereImage。是的,编辑你的代码,让它可读。强迫这里的人阅读难懂的代码被认为不是一种好的形式。我很抱歉,如果每行缩进4个空格,它在这里就不会显示为“代码”。停止道歉,按照我的建议发布MCVE。是的,可以在actionPerformed内完成,只要你在该方法中加入一些逻辑,包括if条件。但我也支持@AndrewThompson的建议,请发布您的建议,以便我们可以更轻松地研究和运行您的代码。我明白您的意思。我发布了完整的代码,但每次我修改x1和y1的值,使新行从上一行结束的位置开始,动画就不会运行。@caine1337:actionPerformed中没有逻辑代码,用于测试行何时结束以及新行何时开始,这正是您需要的。目前只有你知道这些触发器应该是什么。