Java 使用JLayeredFrame动态设置JFrame动画
我试图让动画的基本功能发挥作用。我以前在一个RPG项目中使用过它,但现在有点不同了,因为我使用了几个JComponents,由JPanel和一个JLayeredPane组织。我的问题是让“重画”工作起来。我有一个for循环,如代码底部所示,我尝试稍微更改LegsComponent,然后将其添加到JPane->JLayeredPane->JFrame。但由于某些原因,LegsComponent没有出现。你有什么建议吗?谢谢大家!Java 使用JLayeredFrame动态设置JFrame动画,java,swing,graphics,jpanel,jlayeredpane,Java,Swing,Graphics,Jpanel,Jlayeredpane,我试图让动画的基本功能发挥作用。我以前在一个RPG项目中使用过它,但现在有点不同了,因为我使用了几个JComponents,由JPanel和一个JLayeredPane组织。我的问题是让“重画”工作起来。我有一个for循环,如代码底部所示,我尝试稍微更改LegsComponent,然后将其添加到JPane->JLayeredPane->JFrame。但由于某些原因,LegsComponent没有出现。你有什么建议吗?谢谢大家! import javax.swing.JFrame; import
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.Dimension;
public class Main
{
public static void go()
{
JFrame fr = new JFrame();
JLayeredPane lpane = new JLayeredPane();
JPanel p = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
int size = 120;
p.setSize(500, 500);
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
p2.setSize(500, 500);
p2.setLayout(new BoxLayout(p2, BoxLayout.PAGE_AXIS));
p2.setOpaque(false);
p3.setSize(500, 500);
p3.setLayout(new BoxLayout(p3, BoxLayout.PAGE_AXIS));
p3.setOpaque(false);
final int frHEIGHT = 500;
final int frWIDTH = 500;
fr.setSize(frWIDTH, frHEIGHT);
BodyComponent bC = new BodyComponent(frWIDTH, frHEIGHT, size);
BackgroundComponent bkC = new BackgroundComponent(frWIDTH, frHEIGHT, size);
//initializing LegComponent params
double x = frWIDTH/3;
double y = frHEIGHT/2;
double setX = x+size/2;
double setY = y+size/2;
LegsComponent lC = new LegsComponent(x, y, size, setX, setY);
p.add(bkC);
p2.add(bC);
p3.add(lC);
lpane.setBounds(0, 0, 500, 500);
lpane.add(p, new Integer(0));
lpane.add(p2, new Integer(2));
lpane.add(p3, new Integer(1));
fr.getContentPane().add(lpane);
fr.setVisible(true);
for (int i = 45; i > 0; i--){
JPanel P3 = new JPanel();
JLayeredPane lPane = new JLayeredPane();
double n = .01111*i;
lPane.removeAll();
LegsComponent lC2 = new LegsComponent(x+n, y+n, size, setX, setY);
fr.getContentPane().removeAll();
P3.add(lC2);
P3.setOpaque(false);
lPane.add(p, new Integer(0));
lPane.add(p2, new Integer(2));
lPane.add(P3, new Integer(1));
fr.getContentPane().add(lPane);
fr.setVisible(true);
Tools.pause(100);
}
}
}
简单的回答是为什么要使用组件?你为什么不使用定制绘画?接下来,您将与布局管理器进行斗争,这永远不会有好的结局。接下来,您将面临阻塞事件调度线程的风险,这将阻止UI更新。一般来说,您的想法是不可取的,而且,我看不出
lPane.removeAll()有什么意义代码>,当你刚刚创建了一个新的实例并将其添加到框架中时……哦,如果你没有在EDT的上下文中运行你的代码,那么你就违反了API的单线程特性,这可能会生成各种令人讨厌的绘制工件,提供一个演示你的问题的框架。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应