Wie zentriert man ein Fenster in Java?

Lesezeit: 6 Minuten

Benutzer-Avatar
Andreas Schwan

Wie zentriert man am einfachsten a java.awt.Windowso wie ein JFrame oder ein JDialog?

  • Der Titel sollte “in Swing” und nicht “in Java” lauten, das wäre klarer.

    – Joe Skora

    28. September 2008 um 1:06 Uhr

  • @ Joe setLocation(), setLocationRelativeTo() und setLocationByPlatform() oder alle AWT, nicht Swing. 😉

    – Andrew Thompson

    13. September 2011 um 8:58 Uhr

Benutzer-Avatar
Andreas Schwan

Aus dieser Link

Wenn Sie Java 1.4 oder neuer verwenden, können Sie die einfache Methode setLocationRelativeTo(null) für das Dialogfeld, den Rahmen oder das Fenster verwenden, um es zu zentrieren.

  • Wie @kleopatra in einer anderen Antwort sagte, muss setLocationRelativeTo(null) nach pack() aufgerufen werden, um zu funktionieren.

    – Eusebius

    19. April 2014 um 5:18 Uhr

  • Wie unten erklärt, muss setLocationRelativeTo(null) nach jedem Aufruf von pack() oder setSize() aufgerufen werden.

    – Arnaud P

    13. Mai 2014 um 10:11 Uhr

  • @Eusebius Odd, ich habe ein Tutorial befolgt, das mich dazu gebracht hat, es vorher einzustellen pack() und es platzierte die obere linke Ecke des Rahmens in der Mitte meines Bildschirms. Nachdem Sie die Zeile nach unten verschoben haben pack() es wurde richtig zentriert.

    – Benutzer1433479

    6. Juli 2014 um 20:52 Uhr

  • Nun, pack() legt die richtige Größe basierend auf Inhalt und Layout fest, und Sie können etwas nicht zentrieren, es sei denn, Sie kennen seine Größe. Daher ist es in der Tat seltsam, dass Sie es im Tutorial nach dem Zentrieren gepackt haben.

    – Andreas Schwan

    7. Juli 2014 um 0:09 Uhr

  • Du hast so recht, @user1433479!! vielen Dank für Ihren Kommentar!!! 👍🏼

    – Shai Alon

    1. Januar um 20:18 Uhr

Benutzer-Avatar
Donal

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

  • Ich weiß, dass dies ziemlich alt ist, aber das funktioniert gut, vorausgesetzt, die Framegröße wird vor dem Aufruf dieser Funktion festgelegt

    – S.Krishna

    27. Mai 2016 um 8:14 Uhr

  • Ja, stellen Sie sicher, dass die Größe vorher angewendet wird (z. B. mit pack())

    – Myoch

    23. Februar 2017 um 13:01 Uhr

Benutzer-Avatar
Dzmitri Sevkovich

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

  • Sie haben Recht. Es muss vorher setSize() aufgerufen werden.

    – Sai Dubbaka

    21. Juli 2015 um 22:14 Uhr

Benutzer-Avatar
Kevin Tag

Beachten Sie, dass sowohl die Techniken setLocationRelativeTo(null) als auch Tookit.getDefaultToolkit().getScreenSize() nur für den primären Monitor funktionieren. Wenn Sie sich in einer Umgebung mit mehreren Monitoren befinden, müssen Sie möglicherweise Informationen über den spezifischen Monitor abrufen, auf dem sich das Fenster befindet, bevor Sie diese Art von Berechnung durchführen.

Manchmal wichtig, manchmal nicht…

Sehen GraphicsEnvironment javadocs für weitere Informationen darüber, wie Sie dies erhalten.

Benutzer-Avatar
Peter Szab

Unter Linux der Code

setLocationRelativeTo(null)

Bringen Sie mein Fenster jedes Mal, wenn ich es starte, in einer Multi-Display-Umgebung an eine zufällige Position. Und der Code

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

“Schneiden” Sie das Fenster in zwei Hälften, indem Sie es genau in die Mitte legen, die zwischen meinen beiden Displays liegt. Ich habe die folgende Methode verwendet, um es zu zentrieren:

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 genau in der Mitte der ersten Anzeige erscheinen. Dies ist wahrscheinlich nicht die einfachste Lösung.

Funktioniert einwandfrei unter Linux, Windows und Mac.

  • Die Berücksichtigung von Umgebungen mit mehreren Bildschirmen ist die einzig richtige Antwort, da sonst der Bildschirm, auf dem das Fenster erscheint, zufällig sein könnte oder das Fenster zwischen beiden Bildschirmen zentriert ist.

    – Stefan

    24. Dezember 2015 um 11:15 Uhr

Ich habe endlich diese Reihe von Codes dazu gebracht, in NetBeans mit Swing-GUI-Formularen zu arbeiten, 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); 
    } 

}

ODER

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

  • Die Berücksichtigung von Umgebungen mit mehreren Bildschirmen ist die einzig richtige Antwort, da sonst der Bildschirm, auf dem das Fenster erscheint, zufällig sein könnte oder das Fenster zwischen beiden Bildschirmen zentriert ist.

    – Stefan

    24. Dezember 2015 um 11:15 Uhr

Benutzer-Avatar
Aman Goel

Unten ist Code zum Anzeigen eines Rahmens in der oberen Mitte eines 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) löst Exception {

new SwingContainerDemo().showJFrameDemo();

}

Unten ist die Ausgabe des obigen Code-Snippets:Geben Sie hier die Bildbeschreibung ein

  • frame.setLocation(x, 0); scheint falsch zu sein – sollte es nicht sein frame.setLocation(x, y); stattdessen?

    – halte

    18. September 2017 um 21:05 Uhr

  • x bezeichnet die Länge der x-Achse und y bezeichnet die Länge der y-Achse. Wenn Sie also y = 0 machen, sollte es nur oben sein.

    – Aman Goel

    21. September 2017 um 7:17 Uhr

  • So int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2); existiert nur im Code, um zu zeigen, dass Sie auch in der vertikalen Achse zentrieren können? Ok, ich dachte, Sie hätten einfach vergessen, es zu benutzen, entschuldigen Sie die Probleme.

    – halte

    22. September 2017 um 10:13 Uhr

  • Kein Problem. Denke! Es ist großartig, mit Ihnen zu sprechen.

    – Aman Goel

    25. September 2017 um 7:08 Uhr

1329300cookie-checkWie zentriert man ein Fenster in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy