Javaでウィンドウを中央に配置する方法は?


113

java.awt.Windowa JFrameやa などのを中央に配置する最も簡単な方法は何JDialogですか?


2
タイトルは「Java内」ではなく「Swing内」である必要があります。その方が明確です。
Joe Skora 2008

6
@Joe setLocation()setLocationRelativeTo()およびsetLocationByPlatform()または全てAWTは、スイングではありません。;)
アンドリュートンプソン

回答:


244

このリンクから

Java 1.4以降を使用している場合は、ダイアログボックス、フレーム、またはウィンドウで単純なメソッドsetLocationRelativeTo(null)を使用して中央に配置できます。


9
@kleopatraが別の回答で述べたように、機能するためには、setLocationRelativeTo(null)をpack()の後に呼び出す必要があります。
エウセビウス14

6
以下で説明するように、setLocationRelativeTo(null)は、pack()またはsetSize()の呼び出し後に呼び出す必要があります。
Arnaud P

2
@Eusebius奇数、私は前pack()にそれを設定させたチュートリアルに従い、フレームの左上隅を画面の中央に配置しました。ラインを下に移動した後、pack()適切に中央に配置されました。
user1433479 2014

2
まあpack()はコンテンツとレイアウトに基づいて正しいサイズを設定し、そのサイズが分からない限り何かを中央に配置することはできないため、チュートリアルで中央に配置した後でパックすることは奇妙です。
アンドリュース

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

27

setLocationRelativeTo(null)setSize(x,y)またはを使用した後に呼び出す必要がありますpack()


あなたが正しい。前にsetSize()を呼び出す必要があります。
サイダバカ2015

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

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

メインのjFrameを中央に配置するために、Swing GUIフォームを使用して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);

左上隅を中央に配置します。ウィンドウの中央揃えとは異なります。もう1つは機能せず、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は再現できません-より正確には、フレームをサイズ変更する前に(パックまたは手動のsetSizeによって)setLocationRelativeが呼び出された場合にのみ発生します。サイズがゼロのフレームの場合、左上隅は..と同じ場所です。中心:-)
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)が例外をスローします{

new SwingContainerDemo().showJFrameDemo();

}

以下は、上記のコードスニペットの出力です。ここに画像の説明を入力してください


1
frame.setLocation(x, 0);間違っているframe.setLocation(x, y);ようです- 代わりにすべきではありませんか?
考える

xはx軸の長さを示し、yはy軸の長さを示します。したがって、y = 0にすると、それだけが一番上になります。
Aman Goel 2017

それでint y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);、垂直軸の中央にも配置できることを示すためだけにコードに存在しますか?わかりました。使用するのを忘れたので、ごめんなさい。
考える

問題ない。みなさん!あなたと話すのは素晴らしい。
Aman Goel 2017

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は両方ともフレームの幅と高さです。


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

2番目 -

setLocationRelativeTo(null);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.