因此,我想实现DDA算法以使用带有swing的java绘制线条,但在这里我遇到了一些问题。绘制我使用的每个像素fillRect(X,Y,1,1)
。所以,我需要画出X
和Y
的不同位置画出一条线。为了更新新绘制的“像素”,我使用了revalidate()
和repaint()
,但这似乎删除了我以前绘制的像素,而我只是看到了一个点。作为解决方法,我在我的paintComponent(Graphics)
中注释掉了super.paintComponent(g)
,但这看起来不是一个好的解决方案,因为那样我就无法设置背景颜色,并且如果我使用Thread.sleep()
(其他方式只是看到点)。下面的代码如何在不移除先前绘制的东西的情况下重新绘制秋千
import javax.swing.*;
import java.awt.*;
public class Painter extends JPanel {
private double x1,y1,x2,y2;
Painter(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
@Override
protected void paintComponent(Graphics g) {
//super.paintComponent(g);
setBackground(Color.black);
g.setColor(Color.RED);
g.fillRect((int)x1,(int)y1,1,1);
}
public void drawLine() {
double DX = (x2-x1);
double DY = (y2-y1);
double steps = (Math.abs(DX) > Math.abs(DY)) ? Math.abs(DX) : Math.abs(DY);
double xIncrement = DX/(steps);
double yIncrement = DY/(steps);
try {
for (int i = 0; i < steps; ++i) {
Thread.sleep(50);
x1 += xIncrement;
y1 += yIncrement;
revalidate();
repaint();
}
}
catch (Exception e) {
}
}
}
从我main()
我这样称呼它
JFrame jFrame = new JFrame("Graphics");
Painter dpl = new Painter(0,0,533,333);
jFrame.add(dpl);
jFrame.setSize(720,480);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dpl.drawLine();
如何解决呢?
你应该从一个单独的线程调用'drawLine'。 'repaint'可安全地从EDT外部调用,并通过调用'drawLine'(其中包含'sleep()')来阻止EDT。 – Calculator