【问题标题】:Java (Swing): finding a component's *screen* size when the window is resizedJava(Swing):在调整窗口大小时查找组件的 *screen* 大小
【发布时间】:2011-02-21 01:20:39
【问题描述】:

当调整主 JFrame 的大小时,我需要找到组件的确切屏幕大小(以像素为单位)。

我尝试了几件事,但找不到简单的方法:它可能遗漏了一些明显的东西。

BBBBB JFRAME BORDER BBB
BZZZZZZZZZZZZZZZZZZZZZB
BAAAAAAAAAAAAAAAAAAAAAB
BCC1................DDB
BCCC................DDB
BCCC................DDB
BCCC................DDB
BCCC................2DB
BEEEEEEEEEEEEEEEEEEEEEB
BBBBBBBBBBBBBBBBBBBBBBB

如果用户使主 JFrame 更短(垂直)和更宽(水平),它可能会变成这样:

 BBBBBB JFRAME BORDER BBBBBB
 BZZZZZZZZZZZZZZZZZZZZZZZZZB
 BAAAAAAAAAAAAAAAAAAAAAAAAAB
 BCC1....................DDB
 BCCC....................2DB
 BEEEEEEEEEEEEEEEEEEEEEEEEEB
 BBBBBBBBBBBBBBBBBBBBBBBBBBB

我想要的是在屏幕上找到由点表示的矩形区域的确切大小(以像素为单位)。

我正在添加一个ComponentListener 来获取调整大小的事件,效果很好。

我遇到的问题是,在组件上调用 getWidth()/getHeight() 显然 返回组件的屏幕尺寸,而是返回组件的实际尺寸(例如,您可以拥有) , 一个比它所在的组件更宽的 JPanel)。

欢迎任何提示。

【问题讨论】:

  • +1 用于 ASCII 艺术绘图。
  • @Finglas:谢谢,发现它比某些 Photobucket 图像链接或类似的更“有弹性”:)

标签: java swing resize


【解决方案1】:

您正在寻找JComponent.getVisibleRect()

【讨论】:

  • 非常感谢,我知道我遗漏了一些明显的东西。很好地解决了我的问题,并且可以与我正在使用的布局管理器等配合使用。:)
【解决方案2】:

getWidth()getHeight() 返回组件的宽度和高度。我从未听说过“实际”宽度/高度和“屏幕”宽度/高度之间有什么区别。

然而,一些布局管理器不会用它包含的组件填充面板,并且组件和面板边缘之间的一些空间可能不会被组件占用。在这种情况下,我通常会在底层面板上setBackground(Color.BLUE) 看看发生了什么。

【讨论】:

  • @aioobe:你从未见过因为 JFrame 比 JPanel 小而内容被裁剪的 JPanel!?
  • 如果这是您看到的行为,那么您的布局管理器似乎已损坏。您使用的是哪个布局管理器?
  • @aioobe:IntelliJ IDEA 的 GridLayoutManager,可能用于 IntelliJ IDEA 本身。我有点怀疑它坏了,但我会尝试使用 BorderLayout 来查看。
  • @aioobe:你能解释一下当你把一个最小宽度为 100 的组件放在一个 50 像素宽的 JFrame 中会发生什么。一个完整的布局管理器应该在这里做什么?
  • 以 GridLayout 为例,它不会遵守最小尺寸。我相信最小/最大/首选大小被视为布局管理器的“提示”。虽然找不到它的参考。
【解决方案3】:

这是一种非常垃圾的方式,但您可以使用包装面板,将主面板放入其中。您可以从包装面板调用getWidth()getHeight()

【讨论】:

  • 嘿嘿,我也试过了,但在我的情况下它不起作用:我仍然会有组件给我一个 getWidth()/getHeight(),它会 not 成为真正的 w/h。然而,Nate 的回答是正确的:getVisibleRect() 确实 really 还给了真正的可见 rect :)
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2018-09-25
  • 2012-08-02
相关资源
最近更新 更多