2011-06-15 45 views
1

我已經實現了自定義JPanel,其繪製方法已擴展爲在全屏模式下執行大量手動渲染。現在我想集成另一個JComponent到這個(在我的情況下,一個JPanel,其中包含一個JScrollpaneJTextPane作爲它的視口)應該出現在我的第一個面板的頂部,但因爲我的自定義渲染管道很複雜,因此將JComponent添加到我的面板和它通過AWT系統繪製傳統方式不是一種選擇(我試過了,它最好是古怪的,最壞的情況下不是功能),所以我的問題是:是否可以手動命令JComponent塗上一個指向我的程序通過調用其常規繪畫方法,而不綁定到JContainer,如果是的話,我該怎麼做?繪製JComponent而不將其添加到容器

在此先感謝您的答案。

+0

N.B.如果您無法使用已提供的建議進行工作,我建議您發佈盡力而爲的[SSCCE](http://pscode.org/sscce.html)。 – 2011-06-15 16:49:05

回答

2

是的,只需在對象上調用普通的繪畫方法,並傳遞想要繪製的圖形。然而,這只是描繪它,聽起來像你希望它可能滾動,這意味着你將需要將它添加到您的自定義JPanel。在這種情況下,只需添加面板和佈局管理器,即可將組件放置在您需要的位置。

+0

感謝您的回覆,但這不起作用。我在我的JPanel的paint方法內調用JComponent的paint方法(並將Graphics對象傳遞給它),但未呈現JComponent。它會在我將它添加到面板時渲染,但正如我解釋的那樣,我不想那樣做,因爲結果是非常不理想的,至少可以說。 – Tamori 2011-06-15 15:07:25

+0

在面板中進行其他繪畫之後,您是否繪畫過它? – jzd 2011-06-15 15:10:20

+0

在我的程序中,它應該在我的渲染管道中間的某處繪製,但出於測試目的,我試圖在繪製方法結束時添加它,但它不起作用。在將它傳遞給JComponent的paint方法之前,我還確保將Graphics2D對象的所有變換,顏色,筆畫等重置。 – Tamori 2011-06-15 15:23:44

2

您應該爲組件設置大小。然後定位它使用圖形的translate(x,y)將組件定位到所需的點。

+0

組件的大小設置爲初始化。但是當我調用paint方法時,組件不顯示。 – Tamori 2011-06-15 15:09:15

0

如果層次結構中的任何容器更高的水平,你可以使用

validate(); repaint(); 

對來做到這一點。

如果不是,您可以在最後更改其大小或範圍(如+1,-1)以使其自身重新繪製。

3

請參閱this thread上的LabelRenderTest.java來源。標籤最終被繪製到屏幕上,但在被顯示之前它被繪製到BufferedImage

來源的重要行是..

textLabel.setSize(textLabel.getPreferredSize()); 
+0

還要考慮'RenderingHints.VALUE_ANTIALIAS_ON'。 – trashgod 2011-06-15 19:58:52

+0

@trashgod:是否自動爲「JLabel」啓用了抗鋸齒功能?還是你指的是'BufferedImage'的渲染?我不會認爲它在那個階段是相關的。 – 2011-06-15 20:05:47

+0

在任何繪畫之前,應該在'createGraphics()'返回的上下文中設置提示。方便地,'createGraphics()'返回一個'Graphics2D'對象,並且它應該在完成時得到'dispose()'。 – trashgod 2011-06-15 20:33:27

3

你可以看看的CellRendererPane,看看例如BasicTableUI油漆與它的分量圖像。

+0

歡迎你在這個論壇btw +1 – mKorbel 2011-06-15 15:19:59

相關問題