如何检查 JScrollPane 中的 JComponent 是不是对用户可见?

Posted

技术标签:

【中文标题】如何检查 JScrollPane 中的 JComponent 是不是对用户可见?【英文标题】:How to check whether JComponent inside JScrollPane is visible to a user?如何检查 JScrollPane 中的 JComponent 是否对用户可见? 【发布时间】:2012-11-17 15:28:21 【问题描述】:

假设您有一个JScrollPane 和许多JLabels 或任何其他JComponents 添加到其中。

您将如何检查某个组件是否对用户可见/部分可见/不可见?(滚动)

我尝试过 Google,但找不到简单的解决方案。我是否缺少一些现有的方法,或者我们必须处理坐标和矩形比较?

UPD:以下不适用于我的情况。它似乎与 JLabel.setVisible(true/false) 有关,但不在 JScrollPane 中

JLabel.isVisible();

【问题讨论】:

【参考方案1】:

查看 JComponent java 文档:

Rectangle r = child.getVisibleRect();
if (r.getSize().equals(child.getSize())) 
   // fully visible
 else if (r.isEmpty()) 
   // not visible
 else 
  // partly visible

编辑

将不可见的条件更改为使用 Rectangle api - 感谢 @mKorbel 提醒我 :-)

【讨论】:

@kleopatra 为什么不使用 if (r.intersects(child)) @mKorbel 如果您只对孩子的任何部分是否可见或什么都不可见感兴趣,这是一个选项。并且需要第二个矩形。还是我误解了你的建议? 我已经这样做了,但是如果您移动滚动条并且出现一些新按钮,它们仍然会打印出它们不可见。 r 矩形相对于滚动条和组件滚动条永远不会改变。有什么解决办法吗?还是我做错了什么? 我找到了解决方案。我用这个替换了你的第一行代码:Rectangle r = scrollPane.getViewport().getViewRect()。其中 scrollPane 显然是指向 Scroll Pane 的变量。

以上是关于如何检查 JScrollPane 中的 JComponent 是不是对用户可见?的主要内容,如果未能解决你的问题,请参考以下文章

使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?

如何刷新与 jtable 绑定的 Jscrollpane 中的数据?

如何强制刷新/重绘 JScrollPane?

如何提高 JScrollPane 上的慢速滚动速度?

将JScrollPane添加到GridBagLayout

如何做到这一点,以便当我将可动态调整大小的 JPanel 放入 JScrollPane 时它​​可以工作?