Wie zentriert man am einfachsten a java.awt.Window
so wie ein JFrame
oder ein JDialog
?
Wie zentriert man ein Fenster in Java?
Andreas Schwan
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 habenpack()
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
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
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
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.
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
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();
}
-
frame.setLocation(x, 0);
scheint falsch zu sein – sollte es nicht seinframe.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
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()
undsetLocationByPlatform()
oder alle AWT, nicht Swing. 😉– Andrew Thompson
13. September 2011 um 8:58 Uhr