美好的一天,
希望这是一个快速杀人的问题。我正在编写一个在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();
}
}
答案 0 :(得分:1)
首先,只在有效的程序中JComponent
重新绘制自己。如果在某些时候您发现从控制器代码调用c.repaint()
修复了一些问题,那么您忽略了swing框架核心的基本契约。这绝不是一个好主意。因此,删除所有repaint
和validate
来电是一个良好的开端。接下来重要的是了解轻量级摇摆组件如何绘制他们的孩子。有两种模式:优化和未优化。第一个仅适用于兄弟姐妹在容器中彼此不重叠的情况。如果他们这样做并且优化了绘画,那么当这些组件重新绘制时(例如当您将鼠标指针悬停在它们上面时),您将获得各种奇怪的行为。所有轻量级组件都可以通过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);