【问题标题】:making multiple components appear in jframe with jlayeredpane使用 jlayeredpane 使多个组件出现在 jframe 中
【发布时间】:2013-10-29 20:55:54
【问题描述】:

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

【问题讨论】:

标签: java swing animation panel thread-sleep


【解决方案1】:

首先:您的以下代码应该做什么?:

frame.setVisible(true);
while (true) {
    frame.repaint(); // repainting ?
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

使用while(true) 循环为每个100 ms!! 循环和更新您的gui。你需要了解一下Swing的单线程规则,Event Dispatching Thread和SwingUtilities.invokeLater

检查此answer for details 并参考。

编辑:正如以下 cmets 中所建议的那样:

JLayeredPane 也像其他 JComponent 一样与 LayoutManager 合并。但是在创建时,它使用AbsoluteLayout 作为setLayout(null) 的默认值。所以任何添加到layeredPane 实例的组件都应该有setBound(x, y, width, height)。如果您已经这样做了,请检查layeredPane.add(component, new Integer(index)) 以控制 z-index。

【讨论】:

  • 那么如何将jLayeredPane的实例添加到Jframe中呢?
  • 我已将答案加粗,告诉您如何添加。请检查
  • @user2510809,哪个家伙?你在说什么?查看您的代码。您没有将JLayeredPane 实例pane 添加到JFrame 实例frame。您需要使用 frame.add(pane) 添加它
  • 很抱歉我现在看到了。但我仍然只能看到我的背景。动画或花园面板仍未出现。而且我认为这与我的 while 循环无关(稍后我会研究您关于使用事件调度线程的建议)。现在我只想让动画和花园面板都出现在我的 jframe 中。
  • 等到抱怨与原始问题无关的事情;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2015-08-03
  • 2014-04-05
  • 1970-01-01
  • 2014-12-09
  • 2011-10-12
相关资源
最近更新 更多