2010-08-06 64 views
0

我有一個很大的組件(比如width = 4000px,height = 200px),並且希望能夠在小屏幕上完全看到它。 我沒有看到任何簡單的方法來做一個包裝組件,我的想法如下: 給定一個因素(例如4),組件的大小爲1000x800,通過包裝孩子到4行。尺寸要求將被翻轉以重塑兒童,等等。在繪畫上,組件會用一個正確的Graphics參數調用孩子的paint(Graphics)4次,該參數會將包裝後的空間映射到孩子的空間。
但是,我看不到如何處理所有事件:我應該爲每個兒童生成的事件(PropertyChange)和每個父生成事件(Mouse,Key,Resize,....)設置eventlisteners?這似乎相當多的映射,我很樂意聽到一個更簡單的方法做到這一點...
我沒有看太多在JViewport的實施,但也許這可以幫助我不要你認爲?如何將組件包裝到多行

感謝您的建議!

Frederic。

編輯回答了一些建議重新設計組件的意見:
請允許我在此不同意:使組件成爲一項工作,表明它是另一項工作。如果我想用滾動條來顯示它,我使用滾動窗格,而如果我想要將它分成4行,我想使用類似的解決方案。

我是有問題的組件的設計者(並且對我自己有尖銳的話,正如所建議的那樣,但它導致我無處:-))。我實際上在其中添加了「換行代碼」,但它顯示(非常快!)添加點空間轉換,組件代碼中的繪製管理本身使其真的非常混亂,這就是爲什麼我想象一個專門組件是一個更好的解決方案。 此外,製作自定義組件讓我可以更輕鬆地重用它,作爲任何其他組件的「包裝器」。 想象一下,如果每次使用JScollPane時都必須重新創建類似JScollPane的功能,請處理滾動位置,緩衝繪製和自己組件內的所有內容:希望您不必!

回答

1

你正在接近這個錯誤的方式。這是組件的內容,而不是你應該考慮的組件本身。如果您希望它是1000x800,請將其設置爲這個尺寸。如果組件具有內容 - 例如文本或其他組件 - 適當地計算它們的位置。 (您可能無法使用標準佈局,並可能最終編寫自己的佈局)。如果組件的寬度發生變化,您可能會需要重新計算佈局。

不要調用油漆4次。如果您已經計算了組件的佈局,它是兒童或文本,那麼正確的話,繪畫應該可以正常工作。

作爲對該評論的迴應:在插入任意換行符的意義上,打包直方圖不太可能有用。對於圖形組件,「斷路器」不會準確知道在哪裏插入斷點;您也將失去附加到Y軸的任何信息。更好的解決方案是簡單地將水平方向上的直方圖縮小到適合屏幕寬度,或者將四個直方圖一個放在另一個下方,複製每個的Y軸信息。或者允許水平滾動整個直方圖;或更改座標軸,使直方圖水平繪製。如果以上任何一項工作都不奏效(可能因爲您有數百個直方圖條),也許是一種更具交互性的方法,您可以將一些直方圖條融合在一起以提供概述,並允許用戶「深入」到圖中以獲得在更詳細的信息。

如果問題在於您無法修改原始組件,並且它會繪製固定大小的圖像,那麼您最好的辦法可能是在適當的變換和clipRects上對其調用「paint(Graphics)」四次圖形繪製四個部分「堆疊」。但坦率地說,你可能會扔掉原來的組件。直方圖並不難繪製,並且有很多免費的繪圖軟件包可以幫助您。如果你遇到他們,對原始組件的設計者非常粗魯。

+0

你似乎建議重新設計子組件,但問題是這個組件是一些活動的直方圖,並且它的paintcomponent()中有一個4000x200px的圖像。這就是爲什麼我正在尋找一種更通用的方式將其放在4行中而不用觸摸它... – Goulou 2010-08-08 07:48:45

+0

在我回答此評論之前,通常最好通過編輯原始問題而不是添加解釋性評論來完成此操作。 – DJClayworth 2010-08-09 13:33:51

+0

如果你說你有一個組件,你不能修改它繪製一個4000x200的圖像,並且不允許大小改變,那麼找出誰設計了這個組件,並且與他們有非常尖銳的詞彙。 – DJClayworth 2010-08-09 17:52:53

0

你沒有提到滾動。將它放在它自己的窗格上,然後將該窗格放入滾動面板中。