我试图用Java创建面板上移动线的2D动画(一条从面板中的一个点移动到另一个点的线)。我希望这是可能的。这是我使用的代码。
private void movingline(int length) throws InterruptedException {
for(int i = 0; i + length < width; i++){
for(int j = 0; j + length < height; j++){
eraseline();
drawLine(Color.cyan, i, j, i+length, j+length);
erase = true;
}
}
}
private void eraseline() {
if(erase){
fillCanvas(Color.BLUE);
}
}
运行代码时,面板不显示。
这是画线的代码。
public void drawLine(Color c, int x1, int y1, int x2, int y2) {
int pix = c.getRGB();
int dx = x2 - x1;
int dy = y2 - y1;
canvas.setRGB(x1, y1, pix);
if (dx != 0) {
float m = (float) dy / (float) dx;
float b = y1 - m*x1;
dx = (x2 > x1) ? 1 : -1;
while (x1 != x2) {
x1 += dx;
y1 = Math.round(m*x1 + b);
canvas.setRGB(x1, y1, pix);
}
}
repaint();
}
运行代码时,面板不会显示移动线。任何帮助将非常感激。
最佳答案
我认为最大的问题是您试图从(我猜测)不是事件调度线程的线程更改 GUI 的外观。
解决方案是将 Activity (具体来说,对 eraseLine
和 drawLine
的调用)包装在 Runnable
中。并使用 SwingUtilities.invokeAndWait()
调用 Runnable .
编辑:Java 的图形组件并不能真正让您自己操作 Canvas 。只有组件本身才进行绘制,并且只有在被要求绘制自身时才进行绘制。直接在 Canvas 上绘图,即使您可以让它工作,效果也会很差,因为您会干扰组件的工作。
我没有进行更多解释,而是实现了我认为“正确”的方法。
代码在必要的地方进行了注释,我希望它能给你一些想法。有关更多背景知识,请阅读 Swing 上的官方教程和Graphics .
关于java - 2D 动画未显示面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328288/