請參閱下面的代碼:JPanel組件繪製順序
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順序忽略行爲是正常的嗎?
謝謝您的意見!其實,要解決這個問題,請閱讀:[Swing Painting](http://java.sun.com/products/jfc/tsc/articles/painting/)(找到「Optimized」Drawing),也請閱讀:[ isOptimizedDrawingEnabled()](http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#isOptimizedDrawingEnabled()) – 2011-07-10 17:50:45