【问题标题】:How does a JLabel or JButton tell a JScrollPane that view size has changed?JLabel 或 JButton 如何告诉 JScrollPane 视图大小已更改?
【发布时间】:2012-04-23 08:49:03
【问题描述】:

JLabelJButton 如何通知JScrollPane 视图大小已更改(例如设置图标时),以便确定是否需要显示滚动条?

我如何实现类似的行为以显示带有简单 JPanel 的图像而不使用上述组件?

P.S:我查看了源代码,到目前为止,我所看到的只是一个组件被称为“视图”,并被传递给注册了一些侦听器的JViewJViewport。从那里开始,事情似乎还不清楚。

【问题讨论】:

  • 为了更好的帮助,请尽快使用SSCCE编辑您的问题
  • @JamesPoulson 图片可以是 1) 从 JRE 获得 2) 从 Internet 热链接 3) 在代码中生成。根据记忆,SSCCE 文档中提到了技术 2 和 3。
  • FauxImage 可能是sscce 的方便补充。
  • @AndrewThompson 是的。我忘记了 getResource,我总是可以使用颜色填充。看看我能不能写一些示例代码。
  • @trashgod 看到这条评论的那一刻,它让我想起了你常用的另一种技术——实现Icon。不确定这是否适用于这个用例,但这是另一种需要考虑的技术。

标签: java swing user-interface layout jscrollpane


【解决方案1】:

正如JScrollPane API 中所述,除非您更改策略,否则“只要组件的内容大于视图,就会出现水平和垂直滚动条。”一旦pack() 调整了Window 的大小“以适应其子组件的首选大小和布局”,当验证并重新绘制容器时,滚动窗格会看到任何后续更改。请参阅Painting in AWT and Swing 了解更多信息。

【讨论】:

  • 好的。我一定在这里遗漏了一些东西。我已将 JLabel 设置为 viewPortView 并尝试设置它的尺寸而不设置它的图标。这似乎不会触发视图的调整大小。是否需要调用您提到的方法之一?当文档说“当组件的内容大于视图时,水平和垂直滚动条都会出现。”这是否意味着更改取决于 JLabel 的内容?
  • 在更改内容后调用revalidate()repaint() 可能是合适的。滚动窗格将看到新的几何图形。
  • 我会测试这些方法。如果它们起作用,我怀疑某些呼叫正在从图标向上传播。
  • AbstractButtonsetIcon() 方法在大小发生变化时调用revalidate(),如果图标本身发生变化则调用repaint()。如果你必须自己打电话给他们,那就有别的问题了。
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多