【问题标题】:Java- Not able to animate square, comes out as rotating squareJava-无法为正方形设置动画,显示为旋转正方形
【发布时间】:2014-04-30 10:16:38
【问题描述】:

我是 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);
    }
}
}

我到处寻找无济于事的答案,谁能帮我理解我做错了什么。

【问题讨论】:

  • "最终目标是输出一个动画旋转正方形" -> "我似乎只能创建一个旋转正方形"。这听起来像是在做你想做的事,不......?
  • 不完全是,我可以让一个正方形旋转多次,但我真正想要的是动画,我的意思是形状滚动的错觉。如果您测试第一组代码,您就会明白我的意思。
  • graphicspanel 在我上面提供的 pastebin 中,也感谢帮助! pastebin.com/Ha1pdLrc

标签: java animation user-interface methods awt


【解决方案1】:

我已经快速阅读了您的代码...

不要……

  • 不要在不调用 super.setSize 的情况下覆盖 setSizeJPanel,这样做会对组件的工作方式产生可怕的影响
  • 无论您在方法中做什么,您都必须始终调用 super.paintComponentpaintComponent 做了重要的工作,这将导致在您的组件上留下大量的绘制伪影和/或其他与绘制相关的问题
  • 避免在组件的构造函数中创建JFrame,这会假设组件的使用不健康。您的组件不应该对它的使用方式做出任何假设。
  • 请注意,组件已经有了位置和大小的概念,您应该避免维护自己的详细信息,这会导致混淆您认为状态是什么以及实际状态是什么......
  • 你的延迟方法让我害怕。 Swing 不是线程安全的,与 UI 的所有交互都应始终在 EDT 的上下文中进行。您也不应该阻止 EDT,这样做会阻止处理重绘请求等。

我的教授为我们提供了图形面板类

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

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

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

另外,请记住,变形只会影响在它之后而不是之前绘制的内容。因此,在进行任何绘画之前必须先进行旋转才能使其生效

查看Concurrency in SwingPerforming Custom PaintingPainting in AWT and Swing2D GraphicsCreating a GUI With JFC/Swing 了解更多详情

【讨论】:

  • 阅读您在上面发布的内容,在我真正理解您所说的一切之前,我还有很多工作要做。我真的需要了解 Java,这就是为什么我要在夏天接受精通 Java 的朋友的辅导,但感谢指出代码的缺陷。 :)
【解决方案2】:

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

【讨论】:

  • 我之前和现在都试过了,但仍然没有像 GTest2 类那样动画,谢谢你的解决方案
  • @useruser 当我并排运行这两个版本时,它们看起来是一样的——你发现了什么不同?
  • GTest2 看起来像动画,G7 看起来形状只是旋转某个角度并在该位置放置一个新形状,如果有帮助的话
  • @useruser 您删除了哪个延迟?它必须是drawPolygon 中的那个才能正常工作,否则随着循环执行的次数更多,延迟会更长。所以保持animateCircleOfPolygons中的延迟并将其从drawPolygon中删除
  • 好的,现在我明白你的意思了,我有一个看起来像旋转的形状,但不是我想要的形状,我要测试一些东西并在一分钟内回复你编辑:我更改了一些变量并放入了一个 for 循环,现在我有了我的形状,我想我真的明白为什么它以前不起作用,谢谢帮助!
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多