如何在Java中居中一个窗口?

居中java.awt.Window的最简单方法是什么,比如JFrame或者JDialog

blog.codebeach.com/2008/02/center-dialog-box-frame-or-window-in.html (现已停用

如果您使用的是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()技术都只能用于主监视器。 如果您处于多监视器环境中,则在进行此类计算之前,可能需要获取有关窗口所在的特定监视器的信息。

有时很重要,有时候不重要

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

在使用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); } 

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

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

我终于得到了一堆代码在NetBeans中使用Swing GUI Forms来中心主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... } 

以下对于JDK 1.7.0.07不起作用:

 frame.setLocationRelativeTo(null); 

它将左上angular放在中央 – 与窗口居中不同。 另一个不起作用,涉及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类inheritance,因此frame.getSize也返回窗口的大小。 因此,从垂直和水平尺寸中减去垂直和水平尺寸的一半,以find放置左上angular的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中。 我把它设置为屏幕尺寸高度/宽度的一半。 然后,我通过将左上angular的左上angular放置在屏幕尺寸的1/4处,将屏幕尺寸的1/4放置在上方来居中。 你可以使用类似的概念。

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

 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)throws Exception {

 new SwingContainerDemo().showJFrameDemo(); 

}

下面是上面的代码片段的输出: 在这里输入图像说明

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

使用setLocationRelativeTo(null)setLocation(x,y)来设置窗口居中之后,可能会忽略一些非常简单的事情setLocation(x,y)并且它最终偏离了一点点。

请确保调用pack() 之后使用这些方法中的任何一个,因为您最终将使用窗口本身的尺寸来计算将其放置在屏幕上的位置。 在pack()被调用之前,维度不是你想象的那么抛出计算来居中窗口。 希望这可以帮助。

实际上frame .getHeight()getwidth()不返回值,请通过System.out.println(frame.getHeight());检查它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高度

  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 + rx; int y = (r.height - window.getHeight()) / 2 + ry; window.setLocation(x, y); } 

你也可以试试这个。

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