首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么决定了Java中组件的可见性?

什么决定了Java中组件的可见性?
EN

Stack Overflow用户
提问于 2015-11-12 17:59:39
回答 1查看 989关注 0票数 1

我正在编写一个使用JFrame对象和几个JPanel对象的Java程序。JPanel对象使用have ()和repaint()方法,一些JPanel ojbects有JLabels和JButtons。当我运行程序时,有些不同的组件以我想要的方式是不可见的,也就是说,似乎有些组件隐藏了其他组件。

什么决定程序运行时哪些组件是可见的?这取决于将组件添加到顶层容器的顺序,还是取决于调用每个对象的Does ()方法的顺序?是否可以覆盖此默认可见性?

编辑:我应该添加一些JPanels (及其组件)相互重叠。

编辑:这是一个示例程序。是什么决定哪些组件在屏幕上可见?例如,为什么Button1是可见的,而Button2却不可见?

代码语言:javascript
复制
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);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-12 18:27:04

我应该补充一点,一些JPanels (及其组件)相互重叠。

ZOrder控制绘制组件的顺序。首先绘制具有较高ZOrder的组件。

这是否取决于将组件添加到顶级容器的顺序?

是的,ZOrder被指定为一个组件被添加到容器中,所以最后一个添加的组件将首先被绘制。

您可以使用setComponentZOrder(...)类的Container方法手动更改ZOrder (以及绘制顺序)。例如,如果拖动组件并希望将其绘制在顶部,则可以将其ZOrder设置为0。

您可能需要查看重叠布局。它允许您控制组件的显示方式,因为它们是重叠的(尽管is确实使所有组件都具有相同的大小)

下面是一个示例程序。

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

  1. 不要使用空布局管理器。
  2. 不要覆盖油漆()。定制绘画是通过重写paintComponent()并确保调用super.paintComponent(.)来完成的。
  3. 不要把面板叠在一起。一个JPanel是不透明的,所以在另一个上面添加组件会隐藏下面的组件。

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

Button1之所以画出来是因为它有焦点。如果您将鼠标移到button2旁边,它也将被绘制,因为它响应mouseOver事件。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33678186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档