如何在 Java 中以窗口为中心?

什么是最简单的方法来中心一个 java.awt.Window,如 JFrameJDialog

227298 次浏览

来自 这个链接

如果您使用的是 Java 1.4或更新的版本, 你可以用简单的方法 上的 setLocationRelativeTo (null) 对话框、框或中心窗口 它。

这应该可以在 Java 的所有版本中使用

public static void centreWindow(Window frame) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);
}

注意,setLocationRelativeTo (null)和 Tookit.getDefaultToolkit ()都是。GetScreenSize ()技术仅适用于主监视器。如果您处于多显示器环境中,那么在进行此类计算之前,可能需要获取窗口所在的特定显示器的相关信息。

有时重要,有时不重要。

请参阅 图形环境 javadocs了解更多关于如何得到这个的信息。

SetLocationRelativeTo (null) ;

完整的例子:

public class BorderLayoutPanel {


private JFrame mainFrame;
private JButton btnLeft, btnRight, btnTop, btnBottom, btnCenter;


public BorderLayoutPanel() {
mainFrame = new JFrame("Border Layout Example");
btnLeft = new JButton("LEFT");
btnRight = new JButton("RIGHT");
btnTop = new JButton("TOP");
btnBottom = new JButton("BOTTOM");
btnCenter = new JButton("CENTER");
}


public void SetLayout() {
mainFrame.add(btnTop, BorderLayout.NORTH);
mainFrame.add(btnBottom, BorderLayout.SOUTH);
mainFrame.add(btnLeft, BorderLayout.EAST);
mainFrame.add(btnRight, BorderLayout.WEST);
mainFrame.add(btnCenter, BorderLayout.CENTER);
//        mainFrame.setSize(200, 200);
//        or
mainFrame.pack();
mainFrame.setVisible(true);


//take up the default look and feel specified by windows themes
mainFrame.setDefaultLookAndFeelDecorated(true);


//make the window startup position be centered
mainFrame.setLocationRelativeTo(null);


mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
}
}

以下内容不适用于 JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

它把左上角放在中间-不同于中心的窗口。另外一个也不起作用,涉及 frame.getSize ()和 vicsion.getSize () :

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);

GetSize ()方法继承自 Component 类,因此 frame.getSize 也返回窗口的大小。因此,从垂直和水平尺寸中减去一半的垂直和水平尺寸,找到左上角的 x,y 坐标,就会得到中心点的位置,最终使窗口居中。然而,上面代码的第一行是有用的,“维度...”。只要把这个放在中间:

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension( (int)dimension.getWidth() / 2, (int)dimension.getHeight()/2 ));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.setLocation((int)dimension.getWidth()/4, (int)dimension.getHeight()/4);

JLabel 设置屏幕大小。在 Oracle/Sun 站点的 java 教程中可以找到它的 FrameDemo.java 版本。我把它设置为屏幕高度/宽度的一半。然后,我把它的中心放在左上角的1/4的屏幕尺寸的尺寸从左边,1/4的屏幕尺寸的尺寸从顶部。您可以使用类似的概念。

实际上 frame.getHeight()getwidth()不返回值,检查它由 System.out.println(frame.getHeight());直接把宽度和高度的值,然后它将工作在中心很好。如下所示

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x=(int)((dimension.getWidth() - 450)/2);
int y=(int)((dimension.getHeight() - 450)/2);
jf.setLocation(x, y);

两个450都是我的帧宽 n 高

应该在使用 setSize(x,y)pack()之后调用 setLocationRelativeTo(null)

Linux 上的代码

setLocationRelativeTo(null)

把我的窗口到随机位置,每次我启动它,在一个多显示环境。 还有密码

setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);

把窗户“切”成两半,并把它放在精确的中间,也就是我的两个显示器之间。 我使用以下方法将它居中:

private void setWindowPosition(JFrame window, int screen)
{
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] allDevices = env.getScreenDevices();
int topLeftX, topLeftY, screenX, screenY, windowPosX, windowPosY;


if (screen < allDevices.length && screen > -1)
{
topLeftX = allDevices[screen].getDefaultConfiguration().getBounds().x;
topLeftY = allDevices[screen].getDefaultConfiguration().getBounds().y;


screenX  = allDevices[screen].getDefaultConfiguration().getBounds().width;
screenY  = allDevices[screen].getDefaultConfiguration().getBounds().height;
}
else
{
topLeftX = allDevices[0].getDefaultConfiguration().getBounds().x;
topLeftY = allDevices[0].getDefaultConfiguration().getBounds().y;


screenX  = allDevices[0].getDefaultConfiguration().getBounds().width;
screenY  = allDevices[0].getDefaultConfiguration().getBounds().height;
}


windowPosX = ((screenX - window.getWidth())  / 2) + topLeftX;
windowPosY = ((screenY - window.getHeight()) / 2) + topLeftY;


window.setLocation(windowPosX, windowPosY);
}

使窗口出现在第一个显示的中心。 这可能不是最简单的解决方案。

在 Linux,Windows 和 Mac 上正常工作。

public class SwingExample implements Runnable {


@Override
public void run() {
// Create the window
final JFrame f = new JFrame("Hello, World!");
SwingExample.centerWindow(f);
f.setPreferredSize(new Dimension(500, 250));
f.setMaximumSize(new Dimension(10000, 200));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


public static void centerWindow(JFrame frame) {
Insets insets = frame.getInsets();
frame.setSize(new Dimension(insets.left + insets.right + 500, insets.top + insets.bottom + 250));
frame.setVisible(true);
frame.setResizable(false);


Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);
}
}

下面的代码将 Window集中在当前监视器的中心(即鼠标指针所在的位置)。

public static final void centerWindow(final Window window) {
GraphicsDevice screen = MouseInfo.getPointerInfo().getDevice();
Rectangle r = screen.getDefaultConfiguration().getBounds();
int x = (r.width - window.getWidth()) / 2 + r.x;
int y = (r.height - window.getHeight()) / 2 + r.y;
window.setLocation(x, y);
}

有一些非常简单的东西,你可能会忽略后,试图中心的窗口使用 setLocationRelativeTo(null)setLocation(x,y),它结束了有点偏离中心。

请确保您使用这些方法中的 强之后调用 pack(),因为您最终将使用窗口本身的尺寸来计算在屏幕上放置它的位置。在调用 pack()之前,维度并不是您想象的那样,因此抛弃了以窗口为中心的计算。希望这个能帮上忙。

我最终得到了这些代码,使用 Swing GUI Forms 在 NetBeans 中工作,以便居中显示主 jFrame:

package my.SampleUIdemo;
import java.awt.*;


public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
CenteredFrame(this);  // <--- Here ya go.
}
// ...
// void main() and other public method declarations here...


///  modular approach
public void CenteredFrame(javax.swing.JFrame objFrame){
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
int iCoordX = (objDimension.width - objFrame.getWidth()) / 2;
int iCoordY = (objDimension.height - objFrame.getHeight()) / 2;
objFrame.setLocation(iCoordX, iCoordY);
}


}

或者

package my.SampleUIdemo;
import java.awt.*;


public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
//------>> Insert your code here to center main jFrame.
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
int iCoordX = (objDimension.width - this.getWidth()) / 2;
int iCoordY = (objDimension.height - this.getHeight()) / 2;
this.setLocation(iCoordX, iCoordY);
//------>>
}
// ...
// void main() and other public method declarations here...


}

或者

    package my.SampleUIdemo;
import java.awt.*;
public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
this.setLocationRelativeTo(null);  // <<--- plain and simple
}
// ...
// void main() and other public method declarations here...
}

你也可以试试这个。

Frame frame = new Frame("Centered Frame");
Dimension dimemsion = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dimemsion.width/2-frame.getSize().width/2, dimemsion.height/2-frame.getSize().height/2);

下面是在现有窗口的顶部中心显示框架的代码。

public class SwingContainerDemo {


private JFrame mainFrame;


private JPanel controlPanel;


private JLabel msglabel;


Frame.setLayout(new FlowLayout());


mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
//headerLabel = new JLabel("", JLabel.CENTER);
/* statusLabel = new JLabel("",JLabel.CENTER);
statusLabel.setSize(350,100);
*/ msglabel = new JLabel("Welcome to TutorialsPoint SWING Tutorial.", JLabel.CENTER);


controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());


//mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
// mainFrame.add(statusLabel);


mainFrame.setUndecorated(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
mainFrame.setVisible(true);


centreWindow(mainFrame);

}

public static void centreWindow(Window frame) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, 0);
}




public void showJFrameDemo(){
/* headerLabel.setText("Container in action: JFrame");   */
final JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setLayout(new FlowLayout());
frame.add(msglabel);


frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
frame.dispose();
}
});






JButton okButton = new JButton("Capture");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//      statusLabel.setText("A Frame shown to the user.");
//  frame.setVisible(true);
mainFrame.setState(Frame.ICONIFIED);
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
final Dimension screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
final BufferedImage screen = robot.createScreenCapture(
new Rectangle(screenSize));


SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ScreenCaptureRectangle(screen);
}
});
mainFrame.setState(Frame.NORMAL);
}
});
controlPanel.add(okButton);
mainFrame.setVisible(true);

} Public static void main (String [] args)抛出异常{

new SwingContainerDemo().showJFrameDemo();

}

下面是上面代码片段的输出:enter image description here

示例: 第3行的 Inside myWindow ()是设置屏幕中央窗口所需的代码。

JFrame window;


public myWindow() {


window = new JFrame();
window.setSize(1200,800);
window.setLocationRelativeTo(null); // this line set the window in the center of thr screen
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.BLACK);
window.setLayout(null); // disable the default layout to use custom one.
window.setVisible(true); // to show the window on the screen.
}

电话的顺序很重要:

第一 -

pack();

第二 -

setLocationRelativeTo(null);

除了 多纳尔的答案之外,我还想添加一个小的计算,以确保 Java 窗口完美地位于窗口的中心。不仅仅是 the window is at the center of the window“左上”

public static void centreWindow(JFrame frame, int width, int height) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);


// calculate perfect center
int perf_x = (int) x - width/2;
int perf_y = (int) y - height/2;


frame.setLocation(perf_x, perf_y);
}

如果你想要一个关于 JavaNetBeans 的简单答案:

右键单击 JFrame,转到属性,然后转到代码并选择生成中心选项。

参考图片: 返回文章页面【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟 https://i.stack.imgur.com/rfxbl.png 】

如果你想推动你的应用程序窗口中心,你可以解决以下问题。

int x = (Toolkit.getDefaultToolkit().getScreenSize().width) - getSize().width) / 2;
int y = (Toolkit.getDefaultToolkit().getScreenSize().height) - getSize().height) / 2;
setLocation(x,y);

GetSize ()函数是应用程序帧大小..。 GetScreenSize ()是你的电脑屏幕尺寸。

我想修改 多纳尔的回答以适应多显示设置:

public static void centerWindow(Window frame) {
Rectangle bounds = frame.getGraphicsConfiguration().getBounds();
Dimension dimension = bounds.getSize();
int x = (int) (((dimension.getWidth() - frame.getWidth()) / 2) + bounds.getMinX());
int y = (int) (((dimension.getHeight() - frame.getHeight()) / 2) + bounds.getMinY());
frame.setLocation(x, y);
}