Java 停止已设置动画的抽绳并开始新的抽绳
编辑:这是完整的代码。在执行每个操作之后,我需要在执行repain()之前更改x1、y1、x2、y2和t的值。有没有一个简单的方法可以做到这一点?我只学过一门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
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中没有逻辑代码,用于测试行何时结束以及新行何时开始,这正是您需要的。目前只有你知道这些触发器应该是什么。