决定Java中组件可见性的因素



我正在编写一个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。

您可能需要检出"重叠布局"。它允许您控制组件重叠时的显示方式(尽管它确实使所有组件大小相同)

这是一个示例程序。

你永远不应该写这样的应用程序,因为你会遇到各种各样的问题:

  1. 不要使用null布局管理器
  2. 不要覆盖paint()。自定义绘制是通过重写paintComponent()并确保调用super.paintComponent(…)来完成的
  3. 不要将面板叠放在一起。JPanel是不透明的,所以在一个组件的顶部添加组件会隐藏下面的组件

为什么Button1可见,而Button2不可见?

按钮1被绘制是因为它有焦点。如果将鼠标移到button2旁边,它也会被绘制,因为它会响应mouseOver事件。

如果调整框架的大小,两个按钮都将消失,因为面板将根据ZOrder重新绘制。

我真的不知道你想用那个代码做什么。我所能说的就是不要这么做。使用布局管理器。

最新更新