已经尝试搜索,但找不到任何内容。
我正在尝试使用数组和for循环绘制多个2D椭圆,我每秒都重新绘制一帧。问题是,每次重新绘制时我只会得到一个Ellipse,有人可以告诉我代码有什么问题吗?
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class MovingDot extends JFrame{
static int posX = (int)Math.round(Math.random()*780);
static int posY = (int)Math.round(Math.random()*780);
static int width = (int)Math.round(Math.random()*780);
static int height = (int)Math.round(Math.random()*780);
static int dots = 0;
public static Timer timer;
public MovingDot(){
super("Moving Dot");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 800);
Dot2 dot = new Dot2();
add(dot);
setVisible(true);
timer = new Timer((int)Math.round((1000)), timerAction);
timer.start();
}
private ActionListener timerAction = new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae){
posX = (int)Math.round(Math.random()*780);
posY = (int)Math.round(Math.random()*780);
width = (int)Math.round(Math.random()*780);
height = (int)Math.round(Math.random()*780);
float r = (float)Math.random();
float g = (float)Math.random();
float b = (float)Math.random();
Color col = new Color(r,g,b);
setBackground(col);
dots++;
repaint();
}
};
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run()
{
new MovingDot();
}
});
}
}
class Dot2 extends JPanel{
@Override
public void paintComponent(Graphics c2){
int x = MovingDot.posX;
int y = MovingDot.posY;
int w = MovingDot.width;
int h = MovingDot.height;
float r,g,b;
Color col;
Graphics2D c = (Graphics2D) c2;
c.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Ellipse2D.Float[] e = new Ellipse2D.Float[10];
for (int i = 0; i < 10; i++) {
if (i == 0)
r = (float)Math.random();
else
r = 0.163F;
g = (float)Math.random();
b = (float)Math.random();
col = new Color(r,g,b);
c.setColor(col);
e[i] = new Ellipse2D.Float(x, y, w, h);
c.fill(e[i]);
}
}
}
发现自己出了什么问题,我必须在paintComponent中随机制作x,y,w和h。不,这不适合学校作业,我正在尝试用书自学Java。
关于使我的方法保持静态,我计划在我的JPanel中使用它们,但我意识到我不需要它们,所以我要删除它们。谢谢你的建议!
答案 0 :(得分:2)
ArrayList<Ellipse2D>
而不是数组会更好。这样你就不必检查空值了。如果计数器&gt; = 10,您将停止计时器
此外,您的静态变量都不应该是静态的,并且将它们设置为静态会表明程序设计已关闭。如果这是为了学校作业,那可能会导致你的成绩被扣除。