首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java-不能动画的方块,出来作为旋转的广场

Java-不能动画的方块,出来作为旋转的广场
EN

Stack Overflow用户
提问于 2014-03-23 01:37:31
回答 2查看 129关注 0票数 0

我对java很陌生,需要一些帮助!我的教授希望我创建4种方法,其最终目标是输出一个动画旋转方块,就像我在前面编写的代码中所做的那样:

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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);
    }
}
}

我到处寻找答案,但没有结果,谁能帮我理解我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-23 02:17:03

不太确定我是否完全理解了您的问题,但是如果第二个示例代码G7看起来不是动画的(比如第一个示例代码),因为它比第一个示例代码GTest2慢,这是因为您重复了延迟:gp.delay(30);在第二个代码中;它既出现在animateCircleOfPolygons函数中,也出现在drawPolygon函数中。如果删除代码,就会产生相同的输出(这是应该的--毕竟是相同的逻辑)。

票数 0
EN

Stack Overflow用户

发布于 2014-03-23 02:45:57

我读了你的代码.

别..。

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

我的教授给我们上了GraphicsPanel课

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

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

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

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

有关更多细节,请查看在Swing中并发表演定制绘画AWT和Swing中的绘画二维图形学用JFC/Swing创建GUI

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22585998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档