2008-09-28 48 views
89

什麼是居中java.awt.Window最簡單的方法,如JFrameJDialog如何在Java中居中一個窗口?

+2

標題應該是「在Swing中」而不是「在Java中」,這樣會更清楚。 – 2008-09-28 01:06:25

+4

@Joe`setLocation()`,`setLocationRelativeTo()`和`setLocationByPlatform()`或者所有的AWT,而不是Swing。 ;) – 2011-09-13 08:58:52

回答

205

blog.codebeach.com/2008/02/center-dialog-box-frame-or-window-in.html(現在死了)

如果您使用的是Java 1.4或更高版本, 您可以用簡單的方法 setLocationRelativeTo(空)的 對話框,畫面,或窗口上居中 它。

+4

正如@kleopatra在另一個答案中所說的,必須在pack()之後調用setLocationRelativeTo(null)才能工作。 – Eusebius 2014-04-19 05:18:35

+2

如下所述,在調用pack()或setSize()之後,必須調用setLocationRelativeTo(null)。 – 2014-05-13 10:11:57

+1

@Eusebius Odd,我跟着一個讓我在`pack()`之前設置它的教程,它將框架的一個角落放在屏幕的中心。將該行移動到`pack()`下方後,它正確居中。 – user1433479 2014-07-06 20:52:09

59

這應該在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); 
} 
+0

我知道這是相當古老的,但這工作得很好,只要在調用此函數之前設置了框架大小 – 2016-05-27 08:14:11

+0

是的,確保大小應用於之前(例如使用pack()) – Myoch 2017-02-23 13:01:53

22

注意的所有版本,無論是setLocationRelativeTo(空)和Tookit.getDefaultToolkit()。getScreenSize()技術僅用於主顯示器的工作。如果你是在多顯示器環境中,您可能需要獲得有關特定顯示器的窗口上做這種計算之前的信息。

有時重要,有時不...

關於如何獲得更多的相關信息,請參閱GraphicsEnvironment javadocs

2

frame.setLocationRelativeTo(空);

完整的示例:

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

    } 
} 
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 = 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

另一個也沒有。這些代碼將屏幕的左上角放在中間。 – 2012-09-30 05:46:58

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高度

20

setLocationRelativeTo(空)應該被稱爲你要麼使用的setSize(X,Y)後,或使用包()。

14

在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上正常工作。

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

以下代碼將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); 
} 
2

有很簡單的東西,你可能會俯瞰試圖使用中心窗口後要麼setLocationRelativeTo(null)setLocation(x,y)和它最終被一點點偏離中心。

確保您使用的這些方法任何一個後調用pack(),因爲你最終會使用窗口本身的尺寸計算在何處放置在屏幕上。在調用pack()之前,維度並不是您想象的那樣,因此將計算放在窗口中央。希望這可以幫助。

4

我終於拿到了這串代碼,以便使用Swing GUI窗體在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); 
    } 

} 

OR

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... 

} 

OR

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... 
    } 
0

你也可以試試這個。下面

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

} 公共靜態無效的主要(字串[] args)拋出異常{

new SwingContainerDemo().showJFrameDemo(); 

}

下面是上述代碼 - 的輸出中代碼段:enter image description here