【发布时间】:2010-07-29 09:07:14
【问题描述】:
请看以下代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
final JFrame f=new JFrame("foo");
final JPanel c=new JPanel(null);
f.setContentPane(c);
c.setPreferredSize(new Dimension(500,500));
final JPanel a=new JPanel(null){
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillRect(0, 0, getWidth(), getHeight());
}
};
a.setBounds(0,0,300,300);
c.add(a);
final JPanel b=new JPanel(null){
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.green);
g.fillRect(0, 0, getWidth(), getHeight());
}
};
b.setBounds(200,200,500,500);
c.add(b);
c.setComponentZOrder(a, 0);
f.pack();
f.setVisible(true);
f.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
b.repaint();
}
});
}
}
它基本上只是在第三个面板之上绘制两个面板:面板 A,红色,面板 B,绿色。红色面板 A 具有较低的 z 顺序,因此绘制在面板 B 上。 现在,如果我们强制面板 B 重新绘制自身(只需单击面板 A 和 B 之外的 JFrame),面板 B 会突然在面板 A 上绘制。
如果我切换到使用 JComponent 而不是 JPanel,它可以正常工作,并且 B 不会在 A 上绘制。看起来 JPanel 只是忽略了 Z 顺序。因此,解决方案似乎是使用 JComponent 而不是 JPanel。只是出于好奇 - 对于 JPanel,这种忽略 Z 顺序的行为是否正常?
【问题讨论】:
-
感谢您的 cmets!实际上,要解决这个问题,请阅读:Swing Painting(查找“优化”绘图),另请阅读:isOptimizedDrawingEnabled()