Java(Swing):查找组件';调整窗口大小时的s*屏幕*大小
我需要在调整主JFrame的大小时找到组件的确切屏幕大小(以像素为单位) 我试过几种方法,但找不到简单的方法:它可能错过了一些显而易见的东西Java(Swing):查找组件';调整窗口大小时的s*屏幕*大小,java,swing,resize,Java,Swing,Resize,我需要在调整主JFrame的大小时找到组件的确切屏幕大小(以像素为单位) 我试过几种方法,但找不到简单的方法:它可能错过了一些显而易见的东西 BBBBB JFRAME BORDER BBB BZZZZZZZZZZZZZZZZZZZZZB BAAAAAAAAAAAAAAAAAAAAAB BCC1................DDB BCCC................DDB BCCC................DDB BCCC................DDB BCCC.......
BBBBB JFRAME BORDER BBB
BZZZZZZZZZZZZZZZZZZZZZB
BAAAAAAAAAAAAAAAAAAAAAB
BCC1................DDB
BCCC................DDB
BCCC................DDB
BCCC................DDB
BCCC................2DB
BEEEEEEEEEEEEEEEEEEEEEB
BBBBBBBBBBBBBBBBBBBBBBB
调整大小后,如果用户将主JFrame缩短(垂直)和加宽(水平),可能会变成这样:
我想要的是在屏幕上找到由点指示的矩形区域的精确大小(以像素为单位)
我正在添加一个ComponentListener
来获取调整大小的事件,这很好
我遇到的问题是,在组件上调用getWidth()/getHeight()显然不会返回组件的屏幕大小,而是返回组件的实际大小(例如,您可以有一个比它所在的组件更宽的JPanel)
欢迎任何提示。getWidth()
和getHeight()
返回组件的宽度和高度。我从未听说过“实际”宽度/高度和“屏幕”宽度/高度之间有任何区别
但是,某些布局管理器不会使用其包含的构件填充配电盘,并且该构件与配电盘边缘之间的某些空间可能不会被构件占用。在这种情况下,我通常在底层面板上设置背景(Color.BLUE),以查看发生了什么。这是一种非常垃圾的方式,但您可以使用包装面板,将主面板放入其中。您可以从包装器面板调用
getWidth()
和getHeight()
。您正在寻找的。@aioobe:您从未见过JPanel因为JFrame比JPanel小而内容被裁剪!?如果这是您看到的行为,那么您的布局管理器似乎已损坏。您使用的是哪种布局管理器?@aioobe:IntelliJ IDEA的GridLayoutManager可能用于IntelliJ IDEA本身。我怀疑它是否坏了,但我会尝试使用BorderLayout来查看。@aioobe:你能解释一下,当你将一个最小宽度为100的组件放在一个50像素宽的JFrame中时会发生什么情况吗。一个未损坏的布局管理器应该在这里做什么呢?以GridLayout为例,它不会考虑最小大小。我认为最小/最大/首选尺寸被视为布局管理器的“提示”。但是找不到它的参考资料。+1用于ASCII艺术图纸。@Finglas:谢谢,我发现它比一些Photobucket图像链接或诸如此类的链接更具“弹性:)非常感谢,我知道我遗漏了一些明显的东西。很好地解决了我的问题,并且与我正在使用的布局管理器配合得很好(等等):)呵呵,我也试过了,但在我的情况下,它不起作用:我仍然会让组件给我一个getWidth()/getHeight(),这不是真正的w/h。然而,Nate的答案是正确的:getVisibleRect()确实返回了真正的VisibleRect:)
BBBBBB JFRAME BORDER BBBBBB
BZZZZZZZZZZZZZZZZZZZZZZZZZB
BAAAAAAAAAAAAAAAAAAAAAAAAAB
BCC1....................DDB
BCCC....................2DB
BEEEEEEEEEEEEEEEEEEEEEEEEEB
BBBBBBBBBBBBBBBBBBBBBBBBBBB