JLayeredPane没画画

时间:2012-06-25 20:09:36

标签: java jframe jpanel paint jlayeredpane

美好的一天,

希望这是一个快速杀人的问题。我正在编写一个在JFrame中使用JPanels和JLayeredPane的应用程序。在我的应用程序的初始启动时,其中一个面板不会显示,直到我的鼠标移动到面板所在的区域。我甚至调用了验证和重绘方法,但我仍然可以将两个面板一起显示。有什么建议?谢谢。

这是我的JFrame类(具有主要方法)

import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;


public class Application extends JFrame
{
    public Application()
    {   
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        JLayeredPane lp = new JLayeredPane();
        lp.setBounds(0,0,500,500);
        this.setLayeredPane(lp);

        Mypanel p1 = new Mypanel();
        Mypanel2 p2 = new Mypanel2();

        this.getLayeredPane().add(p1,0);
        this.getLayeredPane().add(p2,1);

        this.validate();
        this.repaint();
        this.validate();
    }


    public static void main(String[] args)
    {
        Application app = new Application();

    }
}

以下是我的小组课程之一

import javax.swing.JButton;
import javax.swing.JPanel;

public class Mypanel extends JPanel
{
    public JButton button;

    public Mypanel()
    {
        this.setLayout(null);
        this.setBounds(0, 0, 500, 500);
        JButton b = new JButton("Hello");
        b.setBounds(20,20,300,300);
        this.add(b);
    }
}

最后是我的最后一个小组课程

import javax.swing.JButton;
import javax.swing.JPanel;


public class Mypanel2 extends JPanel
{
    public JButton button;

    public Mypanel2()
    {
        this.setLayout(null);
        this.setBounds(0, 0, 500, 500);
        JButton b = new JButton("SUP");
        b.setBounds(20,10,200,200);
        this.add(b);
        this.repaint();
        this.validate();
        this.repaint();
    }
}

2 个答案:

答案 0 :(得分:1)

首先,只在有效的程序中JComponent重新绘制自己。如果在某些时候您发现从控制器代码调用c.repaint()修复了一些问题,那么您忽略了swing框架核心的基本契约。这绝不是一个好主意。因此,删除所有repaintvalidate来电是一个良好的开端。接下来重要的是了解轻量级摇摆组件如何绘制他们的孩子。有两种模式:优化和未优化。第一个仅适用于兄弟姐妹在容器中彼此不重叠的情况。如果他们这样做并且优化了绘画,那么当这些组件重新绘制时(例如当您将鼠标指针悬停在它们上面时),您将获得各种奇怪的行为。所有轻量级组件都可以通过setComponentZOrder()处理重叠的子组件。 JLayeredPane仅以更灵活的方式引入层的概念作为控制zorder的手段。它试图明智地选择用什么模式来描绘它的孩子,但遗憾的是它的工作原理有些微妙。所以这段代码可以满足您的需求:

Mypanel p1 = new Mypanel();
Mypanel2 p2 = new Mypanel2();

getLayeredPane().setLayer(p1,0);
getLayeredPane().setLayer(p2,1);

getLayeredPane().add(p1);
getLayeredPane().add(p2);

这不会:

Mypanel p1 = new Mypanel();
Mypanel2 p2 = new Mypanel2();

getLayeredPane().add(p1);
getLayeredPane().add(p2);

getLayeredPane().setLayer(p1,0);
getLayeredPane().setLayer(p2,1);

诀窍是在将子项添加到容器之前调用setLayer,以便JLayeredPane将关闭优化绘制。

BTW我忍不住想知道为什么JLayeredPane?如果你需要在不同的布局之间以编程方式切换,那么无论如何JTabbedPane都是你的答案

答案 1 :(得分:0)

JLayeredPane lp = new JLayeredPane();
JPanel d = new JPanel();
d.setVisible(true);
d.setBounds(10, 10, 556, 386);
lp.add(d, new Integer(0), 0);