Java-不能动画的正方形,出来作为旋转的正方形



我是java新手,需要一些帮助!我的教授想让我创建4个方法,最终目标是输出一个动画旋转的正方形,就像我在前面的代码中所做的那样:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GTest2 {
public static void main(String[] args) {
    GraphicsPanel gp = new GraphicsPanel();
    gp.delay(1000);
    int x = gp.getWidth() / 2;
    int y = gp.getHeight() / 2;
    gp.setLocation(x, y);
    for (int n=1; n <= 150; n++)  {
        gp.clear();
        for (int angle=0; angle < 360; angle += 10) {
            for (int i=0; i < 4; i++)  {             
                gp.draw(100);
                gp.turn(90);
            }
            gp.turn(10);
        }
        gp.render();        
        gp.delay(30);       
        gp.turn(2);         
    }
}
}

我的教授给我们提供了GraphicsPanel类,这样我们就可以做这些创建形状和动画的程序:http://pastebin.com/Ha1pdLrc

这是我到目前为止所做的,但我似乎只能创建一个旋转的正方形:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class G7 {
    public static void main(String[] args) {
        GraphicsPanel gp = new GraphicsPanel();
        gp.delay(1000);         
        animateCircleOfPolygons(gp);
    }
public static void animateCircleOfPolygons(GraphicsPanel gp){ 
    for (int n = 1; n <= 150; n++)  {
        gp.clear();
        drawCircleOfPolygons(gp);
        gp.render();        
        gp.delay(30);       
        gp.turn(2);
    }
}
public static void drawCircleOfPolygons(GraphicsPanel gp){
    for (int angle = 0; angle < 360; angle += 10) {
        drawPolygon(gp, 100, 4);
        gp.turn(10);
    }
}
public static void drawPolygon(GraphicsPanel gp, int sideLength, int sideCount){
    for (int i = 0; i < sideCount; i++)  {
        gp.draw(sideLength);
        gp.turn(360.0 / sideCount);
        gp.delay(30);
    }
}
}

我到处寻找答案都无济于事,有没有人能告诉我我做错了什么

我已经快速阅读了你的代码…

不…

  • 不要在不调用super.setSize的情况下覆盖JPanelsetSize,这样做将对您的组件如何工作产生可怕的后果
  • 无论你在方法中做什么,你必须始终调用super.paintComponent, paintComponent做重要的工作,这将导致许多油漆工件留在你的组件和/或其他油漆相关的问题
  • 避免在组件的构造函数中创建JFrame,这会对组件的使用做出不健康的假设。你的组件不应该对如何使用它做任何假设。
  • 注意组件已经有了位置和大小的概念,你应该避免维护你自己的细节,这会导致混淆你认为的状态是什么和实际状态是什么…
  • 你的延迟方法吓到我了。Swing不是线程安全的,与UI的所有交互应该始终在EDT的上下文中进行。你也不应该阻止EDT,这样做会阻止处理,除其他事项外,重绘请求

我的教授给我们提供了graphicspan

恕我直言,你的教授完全不知道他们在说什么,这是一系列基本的坏想法和即将发生的问题。

你的核心问题是,Swing是一个单线程框架。这意味着你的for循环,你的drawrotate是在EDT的上下文中执行的(事实上,很可能组件还没有被放在屏幕上),这意味着直到你退出这个方法,你的代码生成的任何绘画事件都不能被处理。

负责调度绘制事件的RepaintManager总是高度优化的,这意味着它能够将多个重绘制请求合并为几个实际事件

还要记住,变换只会影响它之后的内容,而不会影响它之前的内容。因此,旋转必须在你进行任何绘画之前完成,以使其生效

查看Swing中的并发性,执行自定义绘画,AWT和Swing中的绘画,2D图形和使用JFC/Swing创建GUI了解更多细节

不确定我是否完全理解你的问题,但如果是第二个示例代码G7似乎没有动画(像第一个),因为它比第一个示例代码GTest2转得慢,这是因为你在第二个代码中复制了延迟:gp.delay(30);;它出现在animateCircleOfPolygons函数和drawPolygon函数中。如果您删除其中任何一个,代码将产生相同的输出(正如它应该的那样-毕竟它们是相同的逻辑)。

最新更新