2011-12-13 29 views
2

我有一個滾動窗格,裏面有一個Jpanel,我用許多按鈕填充這個jpanel。是否有可能獲得當前顯示的組件?在滾動窗格中獲取顯示的組件

因爲我想知道哪些是當前顯示的按鈕。 (我知道我可以通過jpanel.getComponents()訪問一個jpanel的孩子,但是這個窗格中的所有組件都只需要當前屏幕上的組件)。

BR

萊昂

回答

5

我的廟這個容器已經是可見的屏幕上,那麼我建議

1)來提取JScrollPaneJViewPort

2)addChangeListenerJViewPort

3)每個可見JComponent(s)返回Rectangle

4)和Rectangle#intersects返回Boolean值如果是JComponent(s)可見或不可以JViewPort

已經評論到@ mKorbel的回答
+0

非常感謝,這正是我期待的! – Leon

+0

享受彎路,不是嗎:-)沒有什麼是必要的,除了子彈3和第一部分子彈4 ... – kleopatra

1

如何要求的組件,如果他們看到:

for (Component component : jpanel.getComponents()) { 
    if (component instanceof JButton && component.isShowing()) { 
     // We've found a button that is showing... 
    } 
} 
+0

這是不行的becouse如果我滾動滾動面板有組件當前不可見的每一個部件的回報實現的功能isShowing意志,即使有不可見對於用戶... sry – Leon

+0

簡直是錯誤的 - OP明確指出「並非所有.. [但只]當前在屏幕上」(好吧,也許有點誤解:-) – kleopatra

1
scrollPane.getViewport().getView() 
scrollPane.getViewport().getViewRect() 
+0

太複雜了..和_你知道它:-) – kleopatra

7

由於

  • 它是正確的,你需要的是兒童界定
  • 它是正確的,你需要相交的邊界與「東西」
  • 錯誤你需要包含的視口(也不是滾動窗格)

JComponents具有api以獲取其當前可見部分,而不依賴於當前顯示的方式/位置N,所以「東西」是它的visibleRect:

Rectangle visibleRect = myPanel.getVisibleRect(); 
for (Component child : myPanel.getComponents()) { 
    Rectangle childBounds = child.getBounds(); 
    if (childBounds.intersects(visibleRect)) { 
     // do stuff 
    } 
} 
+0

恕我直言,這是最好的答案。我驚訝地發現它在底部! – Jack

+0

c)「你需要包含的視口(也不是滾動面板)',[你不能使用重塑]是錯誤的(http://docs.oracle.com/javase/7/docs/api/javax/swing/的JViewport。HTML#重塑%28int,%20int,%20int,%20int 29%),然後'JViewport'能爲來到返回不同的'Rectangle' /用'JScrollPane' – mKorbel

+0

@mKorbel星期天早上頭刮從/委託 - 正如經常我不太明白你在說什麼:-)在我的代碼中,你看到了一個視口?它不是有整點:沒關係誰是父,內部將採取的一些本質細節。 – kleopatra

相關問題