Java 是非';你看不见还有画吗?

Java 是非';你看不见还有画吗?,java,swing,paint,Java,Swing,Paint,显然答案是否定的,但我还是想知道 如果我有一个面板,里面有很多复杂的组件,需要一段时间才能加载,然后在顶部有另一个非常基本的面板,完全覆盖它,背景面板还会用画法绘制吗 我认为您可以尝试在JPanel和JPanel中的System.out.println(“painting..”)中执行 Java确实有一个重绘管理器,确保只重绘组件的“脏”区域。更多信息请点击此处: 但是,重绘管理器是否能够正确地完成其工作可能取决于您的代码(甚至可能依赖于系统?) 测试这一点的最佳方法是扩展组件并重写其paint

显然答案是否定的,但我还是想知道


如果我有一个面板,里面有很多复杂的组件,需要一段时间才能加载,然后在顶部有另一个非常基本的面板,完全覆盖它,背景面板还会用画法绘制吗

我认为您可以尝试在
JPanel
JPanel
中的
System.out.println(“painting..”)
中执行

Java确实有一个重绘管理器,确保只重绘组件的“脏”区域。更多信息请点击此处:

但是,重绘管理器是否能够正确地完成其工作可能取决于您的代码(甚至可能依赖于系统?)


测试这一点的最佳方法是扩展组件并重写其paintComponent()方法,以便在重新绘制组件时打印消息。将该组件添加到正在覆盖的JPanel中,并查看该组件的paintComponent()方法是否被触发。

是的,您可以将组件一个接一个地绘制。顶部面板下方显示的内容取决于顶部面板的不透明度

参见示例。还可以查看
如何使用分层窗格的
示例的目录

编辑:

显然答案是否定的

我现在更明白这个问题了。您询问的是,即使在复杂面板顶部绘制了不透明面板,复杂组件的绘制是否仍将被绘制。答案是肯定的,在顶部组件上漆之前,底部组件将上漆

每个Swing组件负责绘制其子组件。通常,零部件是以二维方式布置的,但类似OverlayLayout的布局确实允许您在一个零部件的顶部绘制零部件。在这种情况下,所有零部件都会绘制,除非将零部件设置为不可见。简单的例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class OverlayPanel extends JPanel
{
    private static int ctr = 1;

    public OverlayPanel(String name)
    {
        setName( name );
        add( new JLabel("Label " + ctr++) );
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        System.out.println("Painting: " + getName());
        super.paintComponent(g);
    }

    private static void createAndShowUI()
    {
        JPanel panel = new JPanel();
        panel.setLayout( new OverlayLayout(panel) );

        panel.add( new OverlayPanel("first") );
        panel.add( new OverlayPanel("second") );

        JPanel third = new OverlayPanel("third");
        third.setVisible(false);
        panel.add(third);

        JFrame frame = new JFrame("OverlayPanel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

这只会告诉您底层JPanel正在被重新绘制,而不是它的子组件发生了什么。但是这个简单的检查有时会有帮助。但是它属于属于JPanel的组件,而不是JPanel本身。然后你也可以检查组件。我相信OP是问覆盖组件是否会防止它被认为是“脏的”通过RepaitManager.+1您比我更了解问题的意图。但是,决定是否对底部组件进行喷漆的不是RepaitManager。每个Swing组件负责绘制其所有子组件。因此,默认情况下,即使存在顶部构件,也会绘制底部构件。可以通过使底部组件不可见来更改此行为。请看我的简单示例。谢谢您提供的信息!我认为你的答案现在是最正确的。