2013-01-08 28 views
2

我意識到還有另一個與「無限」JScrollPanes有關的問題,但我認爲我所尋找的東西是微妙的不同。如何製作一個包含點集合的JScrollPane?

基本上,我有一個可以在任何方向拖動的對象集合,並且滾動視口的範圍應該總是包含所有這些對象的邊界矩形。換句話說,文件沒有固定的「起源」。因此,如果將對象向左拖動,離開屏幕邊緣,則視口範圍應向負方向展開以包含該對象的新位置。 (它也應該自動滾動拖動,但這是一個單獨的問題,我意識到)。

我不知道如何使用JScrollPane API,這似乎要你設置的首選大小基本組件,但似乎沒有該組件的偏移量或來源的概念。 (底層的JViewport好像可以做到,但我無法弄清楚JViewport API。)

+0

既然你提出了 - 這實際上是一個相當準確的衡量問題的數量,我問過我對任何答案都不滿意的問題的數量。這不是一種懷疑,只是一種觀察。 – Talin

回答

4

滾動窗格和視圖端口實際上與它無關。你需要的是更改視圖端口視圖的首選大小,並讓滾動窗格/視圖端口來處理這個休息。

基本上,您需要做的是計算組件上最寬和最高點,並使視口無效,強制重新計算其佈局要求。

創建一個自定義組件(例如使用JPanel)並覆蓋getPreferredSize方法。該方法應該返回組件所需的大小。

當尺寸需求的變化,叫revalidate()

+0

@Talin這個問題在這裏解決了幾次,在JScrollPane中搜索zoom_in/out,(Mad to invalitade [由Kleopatra描述JScrollPane](http://stackoverflow.com/a/13974131/714968)) – mKorbel

+0

@ mKorbel你可能是正確的,我認爲可以調用視圖組件的無效和驗證視口 - 得到父母更新佈局一些如何 – MadProgrammer

+0

:-)我討厭'invalidate()',沒有別的,這個是我的commmmmmmmmm的原因 – mKorbel

1

行,所以事實證明,簡單的答案是,滾動窗格不能滾動到負座標。 @MadProgrammer建議您必須做的是保持一個單獨的偏移座標,它是一個點。偏移量存儲整個文檔的頂部/左側座標。渲染單個對象時,設置Graphics2D對象的變換,使它們向下和向右移動偏移量,以便所有對象都繪製在正數的座標上,儘管實際上它們可能位於負座標。同樣,在計算滾動窗格的preferredSize時,將偏移量添加到文檔寬度和高度。滾動條事件的座標也需要根據需要進行偏移。

這使您可以保持文檔邊界不被限制爲正數的錯覺,並且文檔的邊界可以在任何方向無限擴展。

相關問題