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组件负责绘制其所有子组件。因此,默认情况下,即使存在顶部构件,也会绘制底部构件。可以通过使底部组件不可见来更改此行为。请看我的简单示例。谢谢您提供的信息!我认为你的答案现在是最正确的。