我对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);
}
}
}
我到处寻找答案,但没有结果,谁能帮我理解我做错了什么?
发布于 2014-03-23 02:17:03
不太确定我是否完全理解了您的问题,但是如果第二个示例代码G7
看起来不是动画的(比如第一个示例代码),因为它比第一个示例代码GTest2
慢,这是因为您重复了延迟:gp.delay(30);
在第二个代码中;它既出现在animateCircleOfPolygons
函数中,也出现在drawPolygon
函数中。如果删除代码,就会产生相同的输出(这是应该的--毕竟是相同的逻辑)。
发布于 2014-03-23 02:45:57
我读了你的代码.
别..。
setSize
of JPanel
wihtout调用super.setSize
,这样做会对组件的工作方式产生可怕的后果。super.paintComponent
,paintComponent
做了重要的工作,这将导致组件和/或其他与油漆相关的问题上留下了大量的画图工件。JFrame
,这就假设组件的使用是不健康的。您的组件不应该对如何使用它做出任何假设。我的教授给我们上了GraphicsPanel课
恕我直言,你的教授完全不知道他们在说什么,这是一系列基本的坏想法和问题等着发生。
您的核心问题是,Swing是一个单线程框架。这意味着您的for
循环(您的draw
和rotate
)是在EDT上下文中执行的(实际上,组件可能还没有放到屏幕上),这意味着在退出该方法之前,代码生成的画图事件都不能被处理。
负责调度绘制事件的RepaintManager
总是经过高度优化,这意味着它能够将多个重绘请求合并为几个实际事件。
另外,请记住,转换只会影响在它之后绘制的内容,而不是之前。因此,在进行任何绘画之前,必须先进行旋转,才能使其生效。
有关更多细节,请查看在Swing中并发、表演定制绘画、AWT和Swing中的绘画、二维图形学和用JFC/Swing创建GUI
https://stackoverflow.com/questions/22585998
复制相似问题