回答
是的,你可以繪製組件在另一個之上。頂部面板下方顯示的內容取決於頂部面板的不透明度。
請參閱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();
}
});
}
}
我想你可以試試System.out.println("painting..")
在public void paintComponent(Graphics g)
都在JPanel
看看會發生什麼。
這隻會告訴你底層的JPanel正在被重新繪製,而不是它的子組件發生了什麼。 –
當然可以。但是這個簡單的檢查有時會起作用 –
但屬於屬於JPanel的組件,而不屬於JPanel本身。 –
(編輯:camickr的答案是真正正確的)
的Java確實有重繪管理器,使得組件的確保只有「髒」的區域被粉刷一新。更多的信息在這裏:http://www.oracle.com/technetwork/java/painting-140037.html#mgr
但是,重繪管理器是否可以做它的工作權可能取決於您的代碼(甚至可能是系統相關?)。
測試此方法的最佳方法是擴展組件並覆蓋其paintComponent()方法,以便在組件重新繪製時打印消息。將該組件添加到正在覆蓋的JPanel中,並查看該組件的paintComponent()方法是否正在觸發。
+1您比我更好地理解了問題的意圖。然而,RepaintManager並不決定是否應繪製底部組件。每個Swing組件都負責繪製其所有子組件。所以默認情況下,即使有頂層組件,底層組件也會被繪製。您可以通過使底部組件不可見來更改此行爲。看我的簡單例子。 – camickr
感謝您的信息!我認爲你的回答是現在最正確的。 –
- 1. 成員仍然是公開可見
- 2. AlertDialog仍然可見evenafter
- 3. popover仍然可見時
- 4. 檢查android列表項目(Drawable)是否仍然可見
- 5. 是否SQL Server 2008 Express仍然可用?
- 6. Google GCM是否仍然可用?
- 7. EntitySpaces的文檔是否仍然可用?
- 8. VBScript - 檢查mailItem是否仍然可行
- 9. MainActivity仍然可見的片段
- 10. 高度爲0時ScrollViewer仍然可見
- 11. Jstree:隱藏的節點仍然可見
- 12. - [UIPopoverController dealloc]達到彈出仍然可見
- 13. popBackStack後仍然可見片段
- 14. 替換片段仍然可見
- 15. Excel某些文字仍然可見
- 16. 禁用時按鈕仍然可見
- 17. 刪除的片段仍然可見
- 18. 使QPushButton不可見但仍然有效?
- 19. 「顯示:無」的元素仍然可見
- 20. 爲什麼裝配仍然可見?
- 21. 顯示元素:無仍然可見?
- 22. 仍然可見的軟鍵盤
- 23. Heroku組織仍然可用?
- 24. 是否仍然有效?
- 25. IOrderedQueryable.AsEnumerable()是否仍然有序?
- 26. ,Cookie是否仍然需要?
- 27. MODI是否仍然維護?
- 28. SSI是否仍然相關?
- 29. 是否session_destroy();仍然工作?
- 30. Sharekit是否仍然有效?
我相信OP詢問覆蓋組件是否會阻止它被RepaintManager視爲「髒」。 –