我想将一个对象添加到JPanel然后在一个时间限制后重新绘制JPanel并添加新对象。
package papProject;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Animation extends JPanel{
private static boolean loop = true;
private static int frameTimeInMillis = 10;
public static void main(String[] args){
JPanel Ani = new JPanel();
Ani.getParent();
setup(Ani);
while (loop) {
Ani.repaint();
try {
Thread.sleep(frameTimeInMillis);
} catch (InterruptedException e) {
}
}
}
public static void setup(JPanel Panel)
{
Circle circle[] = new Circle[10];
JFrame jf = new JFrame();
jf.setTitle("Falling Shapes Animation");
Panel.setLayout(new BorderLayout());
jf.setSize(600,400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(Panel);
for(int i = 0; i < circle.length; i++ )
{
Panel.add(circle[i] = new Circle());
}
}
}
此代码绘制JPanel并向其添加圆形对象,并且应该重新绘制该组件,然后添加新对象。我相信我的问题在于main()方法。
@SuppressWarnings("serial")
public class Circle extends Animation implements ActionListener
{
int ranNum = 0;
int y = 0;
int x = (int) Math.random();
int velY = 2;
Circle()
{
x = getRanNum();
}
public int getRanNum() {
Random rand = new Random();
for (int j = 0; j<10; j++)
ranNum = rand.nextInt(300);
return ranNum;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(x, y, 30, 30);
}
public void actionPerformed(ActionEvent e)
{
if (y>370){
velY =-velY;
}
y = y + velY;
}
}
此代码从随机x位置绘制Cirlce对象并沿y方向移动它。 感谢您提供任何帮助。
答案 0 :(得分:0)
看起来你正在调用EDT(事件调度线程)中的所有内容。 如果那时你使用像
这样的东西 while (loop) {
Ani.repaint();
try {
Thread.sleep(frameTimeInMillis);
} catch (InterruptedException e) {
}
}
}
这实际上会阻止你的线程,而你却什么都没看到。最好为您的动画创建一个新的Thread
或Runnable
,然后启动新的主题。
答案 1 :(得分:0)
我不确定,但在主方法中,您重新绘制JPanel但不是JFrame,它是显示的窗口。我留下你的代码示例,我重新绘制了JFrame和cirlce移动!
@SuppressWarnings("serial")
public class Animation extends JPanel{
private static boolean loop = true;
private static int frameTimeInMillis = 100;
static JFrame jf;
public static void main(String[] args){
JPanel Ani = new JPanel();
Ani.getParent();
setup(Ani);
jf = new JFrame();
while (loop) {
jf.add(new Circle());
jf.repaint();
jf.setVisible(true);
try {
Thread.sleep(frameTimeInMillis);
} catch (InterruptedException e) {
}
}
}