Java Swing:居中组件
Posted
技术标签:
【中文标题】Java Swing:居中组件【英文标题】:Java Swing: Centering components 【发布时间】:2011-06-04 21:25:36 【问题描述】:我正在开发一个 Swing UI,我想在其中集中多个组件(JDialogs 和 JFrames)。我知道下面的代码会计算用户的屏幕尺寸,然后我可以轻松地居中一个组件:
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
为了提高效率,我应该只计算一次并将其存储在某种常量中,以便可以在项目的任何部分重用它。存储它以供以后重用以便跨多个类访问它的最佳做法是什么?
(此外,如果有更好的方法来计算屏幕大小以进行居中,我也愿意听到)
【问题讨论】:
我绝对不会费心尝试缓存屏幕尺寸;它不会对用户体验产生任何实质性影响。 【参考方案1】:java.awt.Window.setLocationRelativeTo(null) 将它在屏幕上居中,而setLocationRelativeTo(someComponent)
将它相对于 java.awt.Component 居中,someComponent。
存储中心的替代方案需要考虑的一件事是,如果用户在程序运行时调整其分辨率,那么存储的常量将不再有效。召回getScreenSize
函数真的很贵吗? (不知道是不是)
【讨论】:
如果一个窗口要居中于另一个窗口,则传递相关组件。 @Software Monkey 是的,我会添加它。谢谢。 这会将组件的左上角放在中心,而不是整个组件。 对于相对于特定组件的情况?您可以操纵从someComponent.getBounds()
返回的Rectangle
来计算精确的中心。即)(左上角)+(宽度的一半,高度)以及“顶部”组件的宽度和高度。然后使用.setLocation
而不是.setLocationRelativeTo
来实现精确居中。
setLocationRelativeTo(someComponent)
似乎不适用于另一台计算机屏幕上的组件。即使它们是可见的,它也会将它们视为“屏幕外”。【参考方案2】:
这会将组件的左上角放在中心,而不是整个组件
这意味着对话框/框架的大小是(0, 0),你的基本代码应该是:
frame.add( .... );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
【讨论】:
【参考方案3】:为了使对象居中,您应该尝试:
X 中的帧位置 = (半帧宽度) - (半屏幕尺寸宽度) Y =(半帧高度)-(半屏幕尺寸高度)几乎相同
您可以轻松地将值存储在具有公共访问权限的主类中,因此您无需多次阅读它们
【讨论】:
哦,太好了,我完全忘记了 setLocationRelativeTo(null),避免我的回答,请有人删除它 我知道如何进行简单的计算以使组件居中。我的问题更多的是关于在哪里存储屏幕尺寸常量,以便所有需要使用屏幕尺寸的类都可以看到它。 @Charlotte 您可以将它们设为主类的公共静态成员。但我不建议这样做。【参考方案4】:另外,如果您自己做,您需要使用Toolkit.getScreenInsets
将屏幕的插入因素考虑在内,以考虑任务栏之类的东西,它可能位于任何屏幕边缘并且具有任何大小。
在我可以针对 Java 1.4 之前,我使用过:
static public void centerWindow(Window wnd, Component relcom)
Rectangle scrbnd=getScreenBounds(wnd);
Dimension wndsiz=wnd.getSize();
Container root=null;
int px,py;
if(relcom!=null)
if(relcom instanceof Window || relcom instanceof java.applet.Applet)
root=(Container)relcom;
else
Container parent;
for(parent=relcom.getParent(); parent!=null; parent=parent.getParent())
if(parent instanceof Window || parent instanceof java.applet.Applet)
root=parent;
break;
if(relcom==null || !relcom.isShowing() || root==null || !root.isShowing())
px=(scrbnd.x+((scrbnd.width -wndsiz.width )/2));
py=(scrbnd.y+((scrbnd.height-wndsiz.height)/2));
else
Point relloc=relcom.getLocationOnScreen();
Dimension relsiz=relcom.getSize();
px=(relloc.x+((relsiz.width -wndsiz.width )/2));
py=(relloc.y+((relsiz.height-wndsiz.height)/2));
if((px+wndsiz.width )>(scrbnd.x+scrbnd.width )) px=((scrbnd.x+scrbnd.width )-wndsiz.width );
if((py+wndsiz.height)>(scrbnd.y+scrbnd.height)) py=((scrbnd.y+scrbnd.height)-wndsiz.height);
if(px<scrbnd.x) px=scrbnd.x;
if(py<scrbnd.y) py=scrbnd.y;
wnd.setLocation(px,py);
【讨论】:
以上是关于Java Swing:居中组件的主要内容,如果未能解决你的问题,请参考以下文章
关于Java swing组件焦点的问题(我猜可能是焦点的问题) 高分求全面