【问题标题】:Get shown component in JScrollPane在 JScrollPane 中获取显示的组件
【发布时间】:2012-01-19 03:07:42
【问题描述】:

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

有没有可能得到当前显示的按钮?

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

【问题讨论】:

    标签: java swing jpanel jscrollpane scrollpane


    【解决方案1】:

    正如已经对@mKorbel 的回答发表的评论:

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

    JComponents 有一个 API 可以独立于它们当前显示的方式/位置来获取它们当前可见的部分,因此“某物”是 JComponent 的 visibleRect:

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

    【讨论】:

    • 恕我直言,这是最好的答案。我很惊讶地发现它在底部!
    • c) it's wrong that you need the containing viewport (nor the scrollpane), not you can to use reshape, 然后JViewport 可以返回不同的Rectangle 来自/委托/来自JScrollPane
    • @mKorbel 周日早上让人头疼——我经常不太明白你在说什么 :-) 你在我的代码中哪里看到了视口?不存在才是重点:无论谁是父母,内部人员都会了解细节。
    • 所以当组件被滚动窗格隐藏时,没有可用的回调函数来获取通知?每次 scolls 时循环遍历所有组件听起来效率低下...(PS:+1 :-))
    • @Matthieu 有一段时间没有动手了,但是 afaik 没有任何 api。如果您真的需要它(无法想象一个用例),您可以实现一个自定义组件来跟踪其子项的“显示”状态,并在该状态更改时触发一些通知。 JViewPort 可能对初学者有好处,但它是一个讨厌的 iirc ;)
    【解决方案2】:

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

    1) 从JScrollPane 中提取JViewPort

    2) addChangeListenerJViewPort

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

    4) 如果JComponent(s)JViewPort 中可见或不可见,则Rectangle#intersects 返回Boolean

    【讨论】:

    • 享受弯路,不是吗 :-) 除了第 3 条和第 4 条的第一部分之外,什么都不需要……
    【解决方案3】:

    询问组件是否可见:

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

    【讨论】:

    • 这将不起作用,因为如果我滚动滚动窗格,则存在当前不可见的组件,即使用户不可见,isShowing 函数也会为每个组件返回 true...sry跨度>
    • 完全错了 - OP 明确指出“不是全部.. [但仅] 当前在屏幕上”(好吧,可能有点误解 :-)
    【解决方案4】:
    scrollPane.getViewport().getView()
    scrollPane.getViewport().getViewRect()
    

    【讨论】:

    • 太复杂了.. 知道:-)
    • 请在您的代码中添加适当的注释。没有注释的代码对问题的作者没有价值。
    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多