【发布时间】:2012-01-19 03:07:42
【问题描述】:
我有一个包含 JPanel 的 JScrollPane。我用许多按钮填充这个 JPanel。
有没有可能得到当前显示的按钮?
我知道我可以通过jpanel.getComponents() 访问 JPanel 的子级,但这些都是此窗格中的组件;我只想要当前在屏幕上的那些。
【问题讨论】:
标签: java swing jpanel jscrollpane scrollpane
我有一个包含 JPanel 的 JScrollPane。我用许多按钮填充这个 JPanel。
有没有可能得到当前显示的按钮?
我知道我可以通过jpanel.getComponents() 访问 JPanel 的子级,但这些都是此窗格中的组件;我只想要当前在屏幕上的那些。
【问题讨论】:
标签: java swing jpanel jscrollpane scrollpane
正如已经对@mKorbel 的回答发表的评论:
JComponents 有一个 API 可以独立于它们当前显示的方式/位置来获取它们当前可见的部分,因此“某物”是 JComponent 的 visibleRect:
Rectangle visibleRect = myPanel.getVisibleRect();
for (Component child : myPanel.getComponents()) {
Rectangle childBounds = child.getBounds();
if (childBounds.intersects(visibleRect)) {
// do stuff
}
}
【讨论】:
it's wrong that you need the containing viewport (nor the scrollpane), not you can to use reshape, 然后JViewport 可以返回不同的Rectangle 来自/委托/来自JScrollPane
我假设这个容器已经在屏幕上可见,那么我建议
1) 从JScrollPane 中提取JViewPort,
2) addChangeListener 到 JViewPort
3) 每个可见的JComponent(s) 返回Rectangle
4) 如果JComponent(s) 在JViewPort 中可见或不可见,则Rectangle#intersects 返回Boolean 值
【讨论】:
询问组件是否可见:
for ( Component component : jpanel.getComponents() ) {
if ( component instanceof JButton && component.isShowing() ) {
// We've found a button that is showing...
}
}
【讨论】:
scrollPane.getViewport().getView()
scrollPane.getViewport().getViewRect()
【讨论】: