Java에서 창을 중앙에 배치하는 방법은 무엇입니까?


113

java.awt.Windowa JFrame또는 a 와 같이 a 를 가운데에 맞추는 가장 쉬운 방법은 무엇입니까 JDialog?


2
제목은 "자바"가 아닌 "스윙"이어야합니다.
Joe Skora

6
@Joe setLocation(), setLocationRelativeTo()setLocationByPlatform()또는 모든 AWT는, 스윙 없습니다. ;)
Andrew Thompson

답변:


244

에서 이 링크

Java 1.4 이상을 사용하는 경우 대화 상자, 프레임 또는 창에서 간단한 메소드 setLocationRelativeTo (null)를 사용하여 중앙에 배치 할 수 있습니다.


9
@kleopatra가 다른 답변에 대해 말했듯이 setLocationRelativeTo (null)는 작동하려면 pack () 후에 호출되어야합니다.
Eusebius

6
아래에 설명 된대로 setLocationRelativeTo (null)는 pack () 또는 setSize ()를 호출 한 후에 호출해야합니다.
Arnaud P

2
@Eusebius Odd, 전에 설정하도록 만든 튜토리얼을 따랐고 pack()프레임의 왼쪽 상단 모서리를 화면 중앙에 배치했습니다. 선을 아래로 이동 한 후 pack()제대로 중앙에 배치되었습니다.
user1433479

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

이 함수를 호출하기 전에 프레임 크기가 설정되어 있다면 이것은 꽤 오래되었다는 것을 알고 있습니다
S.Krishna

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에서 제대로 작동합니다.


다중 화면 환경을 고려하는 것이 유일한 정답입니다. 그렇지 않으면 창이 나타나는 화면이 무작위로 표시되거나 창이 두 화면 사이의 중앙에있을 수 있습니다.
Stephan 2015

6

마침내 메인 jFrame을 중앙에 배치하기 위해 Swing GUI Forms를 사용하여 NetBeans에서 작동하는이 코드 묶음을 얻었습니다.

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은 화면 크기를 설정합니다. Oracle / Sun 사이트의 Java 자습서에서 사용할 수있는 FrameDemo.java에 있습니다. 화면 크기의 높이 / 너비의 절반으로 설정했습니다. 그런 다음 왼쪽 상단을 왼쪽에서 화면 크기 치수의 1/4, 상단에서 화면 크기 치수의 1/4에 배치하여 중앙에 배치했습니다. 비슷한 개념을 사용할 수 있습니다.


1
다른 하나도 마찬가지입니다. 이 코드는 화면의 왼쪽 상단 모서리를 중앙에 배치합니다.
Jonathan Caraballo 2012 년

7
-1은 재현 할 수 없습니다. 또는 더 정확하게 는 프레임 크기를 조정 하기 전에 setLocationRelative가 호출 된 경우에만 발생합니다 (팩 또는 수동 setSize 별). 크기가 0 인 프레임의 경우 왼쪽 상단 모서리가 .. 중심과 같은 위치입니다. :-)
kleopatra

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

new SwingContainerDemo().showJFrameDemo();

}

아래는 위 코드 스 니펫의 출력입니다.여기에 이미지 설명 입력


1
frame.setLocation(x, 0);잘못된 것 같습니다 frame.setLocation(x, y);.
하다고 생각

x는 x 축의 길이를 나타내고 y는 y 축의 길이를 나타냅니다. 따라서 y = 0으로 만들면 맨 위에 있어야합니다.
Aman Goel

그렇다면 int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);코드에 존재하는 것은 세로축의 중심을 맞출 수 있다는 것을 보여주기위한 것입니까? 알겠습니다. 사용하는 것을 잊었다 고 생각했습니다. 문제로 인해 죄송합니다.
deem

문제 없어요. 생각하라! 당신과 이야기하는 것이 좋습니다.
Aman Goel

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 2016

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 프레임의 크기가 0이되기 전에 ... 크기 조정 :-) 바람직하게는 팩 단위로 또는 적어도 setLocationRelative 호출 하기 전에 크기를 0이 아닌 다른 값으로 수동으로 설정 하면 내부 올바른 계산이 허용됩니다
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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.