2014-06-30 55 views
1

我試圖將組件繪製爲PDF。我已經有了itextpdf 4.2,並且一切都很完美。 但是,只有當我試圖呈現可見的框架時,它纔有效。繪製隱藏的Java swing組件

我發現的類似問題是How to paint an invisible JFrame elsewhere?有同樣的問題,但解決方案沒有提供答案。

一小段代碼。 我已經創建了一個JFrame並插入了我想呈現的主要視圖

JFrame jframe = new ShowingFrame(); 
jframe.setPreferredSize(new Dimension(PDFHelper.getOriginalWidth().intValue(), PDFHelper.getOriginalHeight().intValue())); 
jframe.setMinimumSize(new Dimension(PDFHelper.getOriginalWidth().intValue(), PDFHelper.getOriginalHeight().intValue())); 
jframe.add(view); 
jframe.setUndecorated(true); 
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jframe.setState(Frame.ICONIFIED); 
jframe.setState(Frame.NORMAL); 
//jframe.setVisible(true); 

如果我取消jframe.setVisible(true)比一切正常。 但用戶會看到我想避免的這個框架。

所以問題是:如何繪製隱藏的控制?

內搖擺Component.java類的油漆全部方法首先檢查組件可見:

 


    public void paint(Graphics g) { 
     if (isShowing()) { 
      // rest of the code... 
     } 
    } 

 

我試圖創建繼承類ShowingFrame extends JFrame,即覆蓋isShowing,總是返回true。但這沒有幫助。

+0

對於整個'JFrame',這可能很困難。但是,如果足夠繪製框架的*內容窗格*,則應該可以使用http://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#paintComponent-java .awt.Graphics-java.awt.Component中-java.awt中。Container-int-int-int-int-(請注意,該方法有一些注意事項 - 例如它改變了組件邊界 - 但繪製不可見的組件是該方法的實際目的) – Marco13

+0

謝謝,這被看作是工作解決方案,但** paintComponent **僅支持輕量級組件 – WerWolf

回答

2

Swing(和Java Graphics API)經過優化,可以儘快停止渲染。

所以解決的方法是創建一個BufferedImage,從中獲取Graphics實例,然後用它調用component.paint(g);

現在你有一個標籤組件。嘗試獲取選項卡的內容而不是呈現選項卡本身。如果這不起作用,您可以嘗試克隆兒童樹,創建一個新的JPanel,附加孩子並呈現結果。但是如果模型行爲不好,克隆可能變得乏味。

一段代碼中看到這樣一個問題:Swing: Obtain Image of JFrame

+1

我得到了PdfTemplate的圖形(來自itextpdf庫的類),但component.paint(g)不起作用,因爲組件是不可見的。看起來我錯過了一些東西。 – WerWolf

+0

我的猜測是父組件不可見,所以Java甚至不費心問孩子。您可能需要克隆選項卡中的Swing組件以獲取所需內容。 –

+1

@WerWolf:SWAG:如果在嘗試提取圖像之前通過在JFrame上調用'pack()'來渲染它,該怎麼辦? –

1

爲什麼你想畫一些不可見的東西?你的電腦不想浪費CPU週期來渲染無法看到的圖形。事實上,我們做了很多計算,看看每個窗口的哪些部分是可見的,並且只繪製可見部分(所謂的剪輯窗口)。

如果你想繪畫的東西,以便您可以稍後使用或保存它,你總是可以創建一個你想要的大小的BufferedImage並繪製。

+0

所以,我有一個選項卡控件。我想將每個標籤生成爲PDF(不同頁面上的每個標籤)。因此除選定的選項以外,所有選項卡都不可見。我無法呈現它。這就是爲什麼我試圖渲染不可見的元素。 – WerWolf

+0

@WerWolf將每個標籤渲染成BufferedImage。在你的'paint'方法中,你可以將圖像繪製到'Graphics'參數中,並且應該能夠重新使用圖像來將每個圖像保存爲pdf頁面。 – dkatzel

+0

所以這是一個問題,我該怎麼做? – WerWolf

1

如果我取消jframe.setVisible(真),比一切正常。但用戶會看到我想避免的這個框架。

您可以設置框架位置,使其在屏幕上不可見。也許類似於:

frame.pack(); 
Dimension d = frame.getSize(); 
frame.setLocation(-d.witdh, 0); 
+0

在這種情況下,它會在第二臺顯示器上看到。但下一個問題是,在applet下它顯示安全風險窗口。 – WerWolf

+0

*「在這種情況下會在第二臺顯示器上看到。」*您嘗試過嗎?如果是,請將位置設置爲-5000,-5000。我不希望*任何*多顯示器系統顯示。 –