在JScrollPane中获取显示的组件

我有一个包含JPanel的JScrollPane。 我用许多按钮填充这个JPanel。

是否有可能获得当前显示的按钮?

我知道我可以通过jpanel.getComponents()访问JPanel的jpanel.getComponents()但这些都是此窗格中的组件; 我只想要当前在屏幕上的那些。

我假设这个容器已经在屏幕上可见,然后我建议

1)从JScrollPane中提取JViewPort ,

2) addChangeListener到JViewPort

3)每个可见的JComponent(s)返回Rectangle

4)和Rectangle JViewPort返回Boolean值,如果JComponent(s)JViewPort可见或不可见

正如@ mKorbel的回答已经评论过:

  • 你需要孩子的界限是正确的
  • 你需要将这些界限与“某事”相交是正确的
  • 你需要包含视口(也不是滚动窗格)是错误的

JComponents有一个API来获取它们当前可见的部分,而与它们当前显示的确切位置无关,因此“某些东西”是JComponent的visibleRect:

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

如果组件可见,请问组件如何:

 for ( Component component : jpanel.getComponents() ) { if ( component instanceof JButton && component.isShowing() ) { // We've found a button that is showing... } } 
  • Component#isShowing()
 scrollPane.getViewport().getView() scrollPane.getViewport().getViewRect()