我是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
的情况下覆盖JPanel
的setSize
,这样做将对您的组件如何工作产生可怕的后果 - 无论你在方法中做什么,你必须始终调用
super.paintComponent
,paintComponent
做重要的工作,这将导致许多油漆工件留在你的组件和/或其他油漆相关的问题 - 避免在组件的构造函数中创建
JFrame
,这会对组件的使用做出不健康的假设。你的组件不应该对如何使用它做任何假设。 - 注意组件已经有了位置和大小的概念,你应该避免维护你自己的细节,这会导致混淆你认为的状态是什么和实际状态是什么… 你的延迟方法吓到我了。Swing不是线程安全的,与UI的所有交互应该始终在EDT的上下文中进行。你也不应该阻止EDT,这样做会阻止处理,除其他事项外,重绘请求
我的教授给我们提供了graphicspan
恕我直言,你的教授完全不知道他们在说什么,这是一系列基本的坏想法和即将发生的问题。
你的核心问题是,Swing是一个单线程框架。这意味着你的for
循环,你的draw
和rotate
是在EDT的上下文中执行的(事实上,很可能组件还没有被放在屏幕上),这意味着直到你退出这个方法,你的代码生成的任何绘画事件都不能被处理。
负责调度绘制事件的RepaintManager
总是高度优化的,这意味着它能够将多个重绘制请求合并为几个实际事件
还要记住,变换只会影响它之后的内容,而不会影响它之前的内容。因此,旋转必须在你进行任何绘画之前完成,以使其生效
查看Swing中的并发性,执行自定义绘画,AWT和Swing中的绘画,2D图形和使用JFC/Swing创建GUI了解更多细节
不确定我是否完全理解你的问题,但如果是第二个示例代码G7
似乎没有动画(像第一个),因为它比第一个示例代码GTest2
转得慢,这是因为你在第二个代码中复制了延迟:gp.delay(30);
;它出现在animateCircleOfPolygons
函数和drawPolygon
函数中。如果您删除其中任何一个,代码将产生相同的输出(正如它应该的那样-毕竟它们是相同的逻辑)。