如何在Java中将窗口居中?


113

使a java.awt.Window(例如a JFrame或a)居中的最简单方法是JDialog什么?


2
标题应该是“在Swing中”而不是“在Java中”,那样会更清楚。
Joe Skora

6
@Joe setLocation()setLocationRelativeTo()以及setLocationByPlatform()或全部AWT,不能摇摆。;)
Andrew Thompson

Answers:


244

这个连结

如果使用的是Java 1.4或更高版本,则可以在对话框,框架或窗口上使用简单的setLocationRelativeTo(null)方法将其居中。


9
正如@kleopatra在另一个答案中所说的那样,必须在pack()之后调用setLocationRelativeTo(null)才能起作用。
Eusebius

5
如下所述,必须在调用pack()或setSize()之后再调用setLocationRelativeTo(null)。
Arnaud P

2
@Eusebius Odd,我遵循了一个教程,该教程使我之前进行了设置pack(),并将框架的左上角放在屏幕中心。将线移到下方后,将pack()其正确居中。
user1433479 2014年

2
好好pack()根据内容和布局设置正确的大小,并且除非知道大小,否则就不能将其居中,因此,在本教程居中后将其打包,这确实很奇怪。
Andrew Swan

65

这应该适用于所有版本的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);
}

我知道这已经很老了,但是只要在调用此函数之前已设置帧大小
它就

1
是的,请确保之前已应用大小(例如,使用pack())
Myoch


26

请注意,setLocationRelativeTo(null)和Tookit.getDefaultToolkit()。getScreenSize()技术仅适用于主监视器。如果您处于多监视器环境中,则在进行这种计算之前,可能需要获取有关窗口所在的特定监视器的信息。

有时很重要,有时不重要...

有关如何获取此信息的更多信息,请参见GraphicsEnvironment javadocs


17

在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上正常运行。


考虑多屏环境是唯一正确的答案,否则出现该窗口的屏幕可能是随机的,或者该窗口位于两个屏幕中间。
斯蒂芬,2015年

6

最终,我得到了这一系列代码,以便使用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...
   }

3

以下不适用于JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

它将左上角置于中心-与将窗口居中不同。另一个也不起作用,涉及frame.getSize()和Dimension.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 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设置屏幕大小。它位于FrameDemo.java中,可从Oracle / Sun站点的Java教程中获得。我将其设置为屏幕尺寸的高度/宽度的一半。然后,通过将左上角放置在屏幕尺寸的左半角的1/4处,并将屏幕尺寸的大小从顶部算起的1/4角,将其居中。您可以使用类似的概念。


1
另一个也没有。这些代码将屏幕的左上角放在中间。
乔纳森·卡拉巴拉

7
-1无法重现-或更精确地说:仅当调整框架大小(通过压缩或手动setSize)之前调用setLocationRelative时才会发生。对于零尺寸的框架,它的左上角与..的中心相同
。-)

3

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

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();

}

以下是上述代码段的输出:在此处输入图片说明


1
frame.setLocation(x, 0);似乎是错误的-应该frame.setLocation(x, y);吗?
视为

x表示x轴的长度,y表示y轴的长度。因此,如果您使y = 0,那么只有它应该在顶部。
阿曼·戈尔

因此int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);,代码中存在的内容只是表明您也可以在垂直轴上居中?好的,我以为您只是忘了使用它,对不起造成麻烦。
视为

没问题。认为!很高兴与您交谈。
阿曼·戈尔

2

确实有一些简单的事情,您可能会在尝试使用setLocationRelativeTo(null)或将窗口居中后忽略了setLocation(x,y)它,但最终偏离了中心。

确保调用使用这些方法之一,pack()因为最终将使用窗口本身的尺寸来计算将其放置在屏幕上的位置。在pack()调用直到之前,尺寸不是您想的那样,因此放弃了将窗口居中的计算。希望这可以帮助。


2

示例:在第3行的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.
}

2

frame.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);
    }
}

1

以下代码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);
}

1

您也可以尝试一下。

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);

1
那多台显示器呢?
Supuhstar

0

实际上是框架.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高度


1
-1帧的大小在...调整大小之前为零:-)最好按组打包,或者至少调用setLocationRelative 之前至少将其大小手动设置为零以外的值以允许对其内部进行正确计算
kleopatra

0
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);
    }
}

0

呼叫顺序很重要:

首先 -

pack();

第二 -

setLocationRelativeTo(null);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.