使用jlayeredpane使多个组件出现在jframe中

时间:2013-10-29 20:55:55

标签: java swing animation panel thread-sleep

所以我有一个动画类和一个花园面板类。我需要动画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();
            }
        }
    }
}

1 个答案:

答案 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。