Saat kita membuat program GUI dengan Swing, jendelanya sering tampil pada pojok kiri atas atau pada titik (0,0).

Bagaimana caranya agar jendela selalu tampil di tengah-tengah layar?

Apakah kita harus mengatur manual posisi titiknya?

Ya perlu, untuk lebih jelasnya mari kita bahas…

Class-class yang dibutuhkan

Ada dua class yang kita butuhkan untuk membuat jendela JFrame tampil di tengah-tengah.

  1. Dimension untuk membuat objek dimensi
  2. Toolkit untuk mengambil ukuran layar

Kedua class tersebut berada dalam package java.awt.

Method untuk Mengatur Posisi Jendela

Method untuk mengatur posisi jendela adalah setLocation() dengan argumen lokasi koordinat titik x dan y.

  1. x titik horizontal;
  2. y titik vertikal.
Posisi Jenela dalam koordinat layar

Maka untuk membuat jendela tampil di tengah-tengah layar, kita harus menyesuaikan koordinat x dan y berdasarkan tinggi dan lebar layar.

// mengambil ukuran layar
Dimension layar = Toolkit.getDefaultToolkit().getScreenSize();

// membuat titik x dan y
int x = layar.width / 2  - jendela.getSize().width / 2;
int y = layar.height / 2 - jendela.getSize().height / 2;

jendela.setLocation(x, y);

Pertama kita membagi tinggi dan lebar jendela dengan 2. Sehingga titik yang akan kita dapatkan tepat berada di tengah-tengah layar.

Misalkan ukuran layarnya adalah 800x600, maka titik yang akan didapatkan adalah x=400 dan y=300.

Akan tetapi jendelanya tidak tampil di tengah layar dengan sempurnya, karena jendela juga memiliki tinggi dan lebar.

Posisi tengah-tengah layar

Untuk mengatasi ini, hasil bagi dua dari tinggi dan lebar layar kita kurangi dengan tinggi dan lebar jendela yang dibagi dua juga.

int x = layar.width / 2  - jendela.getSize().width / 2;
int y = layar.height / 2 - jendela.getSize().height / 2;

Sekarang jendelanya sudah ditampilkan di tengah-tengah layar.

Posisi tengah-tengah jendela

Kode Lengkap

Sudah paham kan dengan teorinya?

Sekarang mari kita coba terapkan dalam kode.

Silahkan buat JFrame baru, lalu impor class yang dibutuhkan.

import java.awt.Dimension;
import java.awt.Toolkit;

Setelah itu, tambahkan kode berikut pada contstuctor atau di bawah initComponent().

// mengambil ukuran layar
Dimension layar = Toolkit.getDefaultToolkit().getScreenSize();

// membuat titik x dan y
int x = layar.width / 2  - this.getSize().width / 2;
int y = layar.height / 2 - this.getSize().height / 2;

this.setLocation(x, y);
kita menggunakan this untuk menggantikan jendela, karena jendela yang kita buat adalah class turunan dari JFrame.

Sehingga kode lengkapnya akan seperti ini:

import java.awt.Dimension;
import java.awt.Toolkit;

public class JendelaPercobaan extends javax.swing.JFrame {

    // konstruktor
    public JendelaPercobaan() {
        initComponents();
        
        // mengambil ukuran layar
        Dimension layar = Toolkit.getDefaultToolkit().getScreenSize();

        // membuat titik x dan y
        int x = layar.width / 2  - this.getSize().width / 2;
        int y = layar.height / 2 - this.getSize().height / 2;

        this.setLocation(x, y);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate=“collapsed” desc=“Generated Code”>                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("www.petanikode.com");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(138, 138, 138)
                .addComponent(jLabel1)
                .addContainerGap(143, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(134, 134, 134)
                .addComponent(jLabel1)
                .addContainerGap(149, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    public static void main(String args[]) {
        /* Set the Nimbus look and feel /
        //<editor-fold defaultstate=“collapsed” desc=” Look and feel setting code (optional) “>
        / If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         /
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if (“Nimbus”.equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JendelaPercobaan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JendelaPercobaan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JendelaPercobaan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JendelaPercobaan.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        / Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JendelaPercobaan().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}

Silahkan di-run dan lihatlah hasilnya:

Jendela JFrame di tengah layar

Referensi: Stack Overflow