it-swarm.dev

Wie zentriere ich ein Fenster in Java?

Was ist der einfachste Weg, einen Java.awt.Window zu zentrieren, beispielsweise eine JFrame oder eine JDialog?

100
Andrew Swan

Von diesem Link

Wenn Sie Java 1.4 oder neuer verwenden, Sie können die einfache Methode .__ verwenden. setLocationRelativeTo (null) in der Dialogfeld, Rahmen oder Fenster zum Zentrieren es.

225
Andrew Swan

Dies sollte in allen Java-Versionen funktionieren

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);
}
62
Dónal

Beachten Sie, dass die Techniken setLocationRelativeTo (null) und Tookit.getDefaultToolkit (). GetScreenSize () nur für den primären Monitor funktionieren. Wenn Sie sich in einer Umgebung mit mehreren Bildschirmen befinden, müssen Sie möglicherweise Informationen über den jeweiligen Monitor abrufen, in dem sich das Fenster befindet, bevor Sie diese Art der Berechnung durchführen.

Manchmal wichtig, manchmal nicht ...

Siehe GraphicsEnvironment javadocs für weitere Informationen, wie Sie dies erhalten.

24
Kevin Day

setLocationRelativeTo (null) sollte aufgerufen werden, nachdem Sie setSize (x, y) oder pack () verwendet haben.

22

Unter Linux den Code

    setLocationRelativeTo(null)

Bringen Sie mein Fenster bei jedem Start an einen beliebigen Ort, in einer Umgebung mit mehreren Bildschirmen und dem Code

    setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);

Schneiden Sie das Fenster in zwei Hälften und platzieren Sie es genau auf die Mitte zwischen den beiden Anzeigen.

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

Lässt das Fenster in der Mitte der ersten Anzeige erscheinen .. Dies ist wahrscheinlich nicht die einfachste Lösung.

Funktioniert einwandfrei unter Linux, Windows und Mac.

15
Peter Szabo

Ich habe endlich diese Reihe von Codes für die Arbeit in NetBeans mit Hilfe von Swing GUI Forms erhalten, um den Haupt-jFrame zu zentrieren:

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

}

ODER 

    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...
   }
4
TheLooker

unten ist der Code zum Anzeigen eines Rahmens in der oberen Mitte des vorhandenen Fensters.

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) wirft Ausnahme {

new SwingContainerDemo().showJFrameDemo();

}

Unten ist die Ausgabe des obigen Code-Snippets:  enter image description here

3
Aman Goel

Folgendes funktioniert nicht für JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

Es stellt die obere linke Ecke in die Mitte - nicht dasselbe wie das Zentrieren des Fensters. Die andere funktioniert auch nicht, wenn es sich um frame.getSize () und dimension.getSize () handelt:

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

Die getSize () - Methode wird von der Component-Klasse geerbt. Daher gibt frame.getSize auch die Größe des Fensters zurück. Wenn Sie also die Hälfte der vertikalen und horizontalen Bemaßungen von den vertikalen und horizontalen Bemaßungen abziehen, um die x-, y-Koordinaten der oberen linken Ecke zu ermitteln, erhalten Sie die Position des Mittelpunkts, der das Fenster ebenfalls zentriert. Die erste Zeile des obigen Codes ist jedoch hilfreich: "Dimension ...". Tun Sie dies einfach, um es zu zentrieren:

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

Das JLabel legt die Bildschirmgröße fest. Es ist in FrameDemo.Java in den Java-Tutorials auf der Oracle/Sun-Site verfügbar. Ich habe die halbe Höhe/Breite des Bildschirms eingestellt. Dann habe ich es zentriert, indem ich oben links 1/4 der Bildschirmgröße von links und 1/4 der Bildschirmgröße von oben platziert habe. Sie können ein ähnliches Konzept verwenden.

3

Es gibt etwas wirklich Einfaches, das Sie übersehen könnten, nachdem Sie versucht haben, das Fenster mit setLocationRelativeTo(null) oder setLocation(x,y) zu zentrieren, und es wird ein wenig aus der Mitte. 

Stellen Sie sicher, dass Sie eine der folgenden Methoden verwenden: after , um pack() aufzurufen, da Sie am Ende die Dimensionen des Fensters selbst verwenden, um die Position des Fensters auf dem Bildschirm zu berechnen. Bis zum Aufruf von pack() sind die Dimensionen nicht das, was Sie denken, und werfen die Berechnungen aus, um das Fenster zu zentrieren. Hoffe das hilft.

2
Clay Ellis

frame.setLocationRelativeTo (null);

Vollständiges Beispiel:

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

    }
}
2
    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
borchvm

Sie könnten dies auch versuchen.

       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);
0
manikant gautam

Beispiel: In myWindow () in Zeile 3 befindet sich der Code, den Sie benötigen, um das Fenster in die Mitte des Bildschirms zu setzen. 

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

Der folgende Code zentriert die Window in der Mitte des aktuellen Monitors (dh wo sich der Mauszeiger befindet).

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

Tatsächlich geben frame.getHeight() und getwidth() keine Werte zurück, überprüfen Sie diese mit System.out.println(frame.getHeight());, geben Sie die Werte für Breite und Höhe direkt ein, dann funktioniert es in der Mitte. zB: wie unten

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();      
int x=(int)((dimension.getWidth() - 450)/2);
int y=(int)((dimension.getHeight() - 450)/2);
jf.setLocation(x, y);  

beide 450 ist meine Rahmenbreite n Höhe