Frage

Was ist der einfachste Weg, einen java.awt.Window, wie ein JFrame oder JDialog zum Zentrum?

War es hilfreich?

Lösung

Von Link

  

Wenn Sie Java 1.4 oder höher verwenden,   Sie können die einfache Methode verwenden   setLocationRelativeTo (null) auf der   Dialogfeld, einen Rahmen oder Fenster zu zentrieren   es.

Andere Tipps

Dies sollte in allen Versionen von Java arbeiten

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

Beachten Sie, dass sowohl die setLocationRelativeTo (null) und Tookit.getDefaultToolkit (). GetScreenSize () -Techniken für den primären Monitor nur arbeiten. Wenn Sie in einer Multi-Monitor-Umgebung sind, müssen Sie möglicherweise Informationen über den jeweiligen Monitor erhalten das Fenster auf ist, bevor diese Art der Berechnung zu tun.

Manchmal wichtig, manchmal nicht ...

Siehe GraphicsEnvironment javadocs mehr Informationen darüber, wie diese zu erhalten.

setLocationRelativeTo (null) soll nach dem Sie entweder setSize (x, y), oder verwenden Sie Pack () aufgerufen werden.

Unter Linux der Code

    setLocationRelativeTo(null)

Setzen Sie mein Fenster zu zufälligem Ort jedes Mal, wenn ich es ins Leben gerufen, in einer Multi-Display-Umgebung. Und der Code

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

„cut“ das Fenster in zwei Hälften mit ihm genau in der Mitte platziert, die zwischen meinen beiden Displays sind. Früher habe ich die folgende Methode 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);
}

Macht das Fenster rechts in der Mitte der ersten Anzeige. Dies ist wahrscheinlich nicht die einfachste Lösung.

funktioniert ordnungsgemäß auf Linux, Windows und Mac.

Ich habe endlich dieses Bündel von Codes in NetBeans mit Swing GUI Forms zu arbeiten, um Haupt-JFrame zum Zentrum:

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 folgenden funktioniert nicht für JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

Es setzt die linke obere Ecke in der Mitte - nicht das gleiche wie das Fenster zentriert. Der andere funktioniert auch nicht, an denen frame.getSize () und 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);

Der getSize () -Methode aus der Komponentenklasse geerbt, und deshalb frame.getSize gibt die Größe des Fensters als auch. Somit Hälfte der vertikalen und horizontalen Abmessungen von den vertikalen und horizontalen Abmessungen subtrahiert die X zu finden, y-Koordinaten, wobei die obere linke Ecke zu plazieren, bietet die Lage des Mittelpunkts, die das Fenster als auch Zentrierung endet. Allerdings ist die erste Zeile des obigen Codes nützlich, „Dimension ...“. Genau dies tut es zum Zentrum:

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

Die JLabel stellt die Bildschirmgröße. Es ist in FrameDemo.java an der Oracle / Sun-Website auf den Java-Tutorials zur Verfügung. Ich stelle es auf dem Bildschirm Höhe / Breite halbe Größe. Dann zentrierte ich es durch die obere linke Ecke bei 1/4 der Bildschirmgröße Dimension von links platzieren und 1/4 der Dimension der Bildschirmgröße von oben. Sie können ein ähnliches Konzept verwendet werden.

unten ist der Code für einen Rahmen im oberen Mitte der vorhandenen Fenster angezeigt wird.

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

}

Im Folgenden ist der Ausgang von oben Code-Schnipsel:

frame.setLocationRelativeTo (null);

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

    }
}

Es ist etwas wirklich einfach, dass man entweder setLocationRelativeTo(null) oder setLocation(x,y) das Fenster zu zentrieren, nachdem er versucht werden, mit Blick auf möglicherweise verwenden und es endet als ein wenig aus der Mitte nach oben.

Stellen Sie sicher, dass Sie entweder eine dieser Methoden verwenden nach pack() aufrufen, weil die Sie die Dimensionen des Fensters am Ende mit sich, wo zu berechnen, es zu platzieren auf dem Bildschirm. Bis pack() genannt wird, werden die Dimensionen nicht, was würden Sie denken, so die Berechnungen Abwerfen das Fenster zu zentrieren. Hoffe, das hilft.

Beispiel: Inside myWindow () in Zeile 3 ist der Code, den Sie das Fenster in der Mitte des Bildschirms einstellen müssen.

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

Eigentlich frame.getHeight() und getwidth() tut Rückgabewerte, überprüfen Sie es von System.out.println(frame.getHeight()); direkt die Werte für Breite und Höhe setzen, dann wird es in der Mitte gut funktionieren. 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

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

Das folgende Code Zentrum der Window in der Mitte des Strommonitor (dh wenn 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);
}

Sie könnten versuchen, diese auch.

       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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top