2014-03-05 123 views
2

似乎很明顯的答案是否定的,但我仍想找出答案。組件是否仍然可見?

如果我的面板上有許多複雜的組件,需要一段時間才能加載,然後在頂部覆蓋另一個非常基本的面板,完全覆蓋它,背景面板是否仍然被塗上油漆方法?

回答

3

是的,你可以繪製組件在另一個之上。頂部面板下方顯示的內容取決於頂部面板的不透明度。

請參閱Glass Pane示例。另請參閱How to Use Layered Panes示例的目錄。

編輯:

似乎是顯而易見的答案是否定的

我明白這個問題現在好多了。即使複雜面板的頂部塗有不透明的面板,您是否仍然會繪製複雜組件的繪畫。答案是肯定的,底部組件將被繪製,頂部組件被繪製之前。每個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(); 
      } 
     }); 
    } 
} 
+0

我相信OP詢問覆蓋組件是否會阻止它被RepaintManager視爲「髒」。 –

0

我想你可以試試System.out.println("painting..")public void paintComponent(Graphics g)都在JPanel看看會發生什麼。

+0

這隻會告訴你底層的JPanel正在被重新繪製,而不是它的子組件發生了什麼。 –

+0

當然可以。但是這個簡單的檢查有時會起作用 –

+0

但屬於屬於JPanel的組件,而不屬於JPanel本身。 –

3

(編輯:camickr的答案是真正正確的)

的Java確實有重繪管理器,使得組件的確保只有「髒」的區域被粉刷一新。更多的信息在這裏:http://www.oracle.com/technetwork/java/painting-140037.html#mgr

但是,重繪管理器是否可以做它的工作權可能取決於您的代碼(甚至可能是系統相關?)。

測試此方法的最佳方法是擴展組件並覆蓋其paintComponent()方法,以便在組件重新繪製時打印消息。將該組件添加到正在覆蓋的JPanel中,並查看該組件的paintComponent()方法是否正在觸發。

+1

+1您比我更好地理解了問題的意圖。然而,RepaintManager並不決定是否應繪製底部組件。每個Swing組件都負責繪製其所有子組件。所以默認情況下,即使有頂層組件,底層組件也會被繪製。您可以通過使底部組件不可見來更改此行爲。看我的簡單例子。 – camickr

+0

感謝您的信息!我認爲你的回答是現在最正確的。 –