我正在开发一个Swing UI,我希望将多个组件(JDialogs和JFrames)集中在一起。我知道以下代码将计算用户的屏幕大小,从那里,我可以轻松地集中一个组件:
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
为了效率,我应该只计算一次并将其存储在某种常量中,以便可以在项目的任何部分重复使用。存储它以便以后重用的最佳实践是什么,因此可以跨多个类访问它?
(此外,如果有更好的方法来计算屏幕尺寸以进行居中,我也愿意听到这一点)
答案 0 :(得分:3)
java.awt.Window.setLocationRelativeTo(null)会将其置于屏幕中心,而setLocationRelativeTo(someComponent)
将相对于java.awt.Component, someComponent 居中。
存储中心的替代方案需要考虑的一点是,如果用户在程序运行时调整其分辨率,则存储的常量将不再有效。回想起getScreenSize
函数真的很贵吗? (我不知道是不是)
答案 1 :(得分:2)
这会将组件的左上角置于中心,而不是整个组件
这意味着对话框/框架的大小为(0,0),您的基本代码应为:
frame.add( .... );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
答案 2 :(得分:1)
对于居中对象,您应该尝试:
X =(半帧宽)中的帧位置 - (半屏宽度) Y =(半帧高度) - (半屏幕高度)
几乎相同您可以轻松地将值存储在具有公共访问权限的主类中,因此您不需要多次阅读它们
答案 3 :(得分:0)
此外,如果你自己动手,你需要使用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);
}