所以我有一个动画类和一个花园面板类。我需要动画jcomponent出现在花园面板jcomponent的顶部。我想我会用jlayeredpane来帮助我实现这个目标,但到目前为止,我得到的是我的背景,我设置为绿色。我想如果我将jlayeredpane添加到框架然后只将组件添加到jlayered窗格,那么我将能够在花园面板上看到动画,但事实并非如此,所以现在我卡住了。任何帮助?这是我的课程,其中包含主要内容:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagLayout;
import java.awt.Panel;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
public class Driver {
public static void main(String[] args) {
JFrame frame = new JFrame();
JLayeredPane pane = new JLayeredPane();
Color c = new Color(0, 255, 0);
frame.setSize(800, 600);
frame.setBackground(c);
frame.getContentPane().add(pane);
Animation animation = new Animation();
pane.add(animation);
pane.add(new GardenPanel(6, 4, 600, 800));
pane.setComponentZOrder(animation, 0);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true) {
frame.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
答案 0 :(得分:0)
首先:您的下列代码应该是什么?:
frame.setVisible(true);
while (true) {
frame.repaint(); // repainting ?
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
使用while(true)
循环来循环并更新每个100 ms
的gui !!您需要了解Swing的单线程规则,事件调度线程和SwingUtilities.invokeLater
。
检查此answer for details并参考。
编辑:正如以下评论中所建议的那样:
JLayeredPane
也与其他LayoutManager
合并JComponent
。但是,在创建时,AbsoluteLayout
默认使用setLayout(null)
。因此,任何组件都添加到layeredPane
实例应该有setBound(x, y, width, height)
。如果您已经这样做了,请检查layeredPane.add(component, new Integer(index))
以控制z-index。