我正在编写一个Java GUI程序,该程序使用一个JFrame对象和几个JPanel对象。JPanel对象使用paint()和request()方法,并且一些JPanel ojbects具有JLabels和JButton。当我运行程序时,这些不同的组件中的一些组件并不像我希望的那样可见,也就是说,似乎有些组件隐藏了其他组件。
是什么决定程序运行时哪些组件可见?这取决于组件添加到顶级容器的顺序,还是取决于每个对象的paint()方法的调用顺序?是否可以覆盖此默认可见性?
编辑:我应该补充一下,一些JPanel(及其组件)相互重叠。
编辑:这是一个示例程序。是什么决定了哪些组件在屏幕上可见?例如,当按钮2不可见时,为什么按钮1可见?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test1 extends JFrame {
public Test1() {
setLayout(null);
setSize(500, 700);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new Test2());
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test1();
}
});
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test2 extends JPanel {
public Test2() {
setBounds(0, 0, 300, 500);
setLayout(null);
add(new Test3());
add(new Test4());
setVisible(true);
}
public void paint(Graphics g) {
g.drawRect(0, 0, 250, 450);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test3 extends JPanel {
public Test3() {
setBounds(0, 0, 300, 300);
setVisible(true);
}
public void paint(Graphics g) {
g.fillRect(40, 50, 200, 150);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test4 extends JPanel {
public JLabel label1 = new JLabel("Label1");
public JLabel label2 = new JLabel("Label2");
public JButton button1 = new JButton("Button1");
public JButton button2 = new JButton("Button2");
public Test4() {
setBounds(0, 300, 300, 200);
add(label1);
add(label2);
add(button1);
add(button2);
setVisible(true);
}
}
我应该补充一点,一些JPanel(及其组件)相互重叠。
ZOrder控制零部件的喷漆顺序。首先绘制具有较高ZOrder的零部件。
它是否取决于组件添加到顶级容器的顺序
是的,ZOrder是在组件添加到容器时指定的,因此最后添加的组件将首先绘制。
可以使用Container
类的setComponentZOrder(...)
方法手动更改ZOrder(从而更改绘制顺序)。例如,如果拖动零部件并希望将其绘制在顶部,则可以将其ZOrder设置为0。
您可能需要检出"重叠布局"。它允许您控制组件重叠时的显示方式(尽管它确实使所有组件大小相同)
这是一个示例程序。
你永远不应该写这样的应用程序,因为你会遇到各种各样的问题:
- 不要使用null布局管理器
- 不要覆盖paint()。自定义绘制是通过重写paintComponent()并确保调用super.paintComponent(…)来完成的
- 不要将面板叠放在一起。JPanel是不透明的,所以在一个组件的顶部添加组件会隐藏下面的组件
为什么Button1可见,而Button2不可见?
按钮1被绘制是因为它有焦点。如果将鼠标移到button2旁边,它也会被绘制,因为它会响应mouseOver事件。
如果调整框架的大小,两个按钮都将消失,因为面板将根据ZOrder重新绘制。
我真的不知道你想用那个代码做什么。我所能说的就是不要这么做。使用布局管理器。