Maaf jika duplikat, tidak dapat menemukan jawaban yang tepat Saya mencoba memusatkan JPanel yang dengan sendirinya ditambahkan ke JPanel lain kelas publik bgframe extends JPanel { // Gambar untuk menyimpan ...

0
Lucas Grandjean 5 April 2021, 19:24

2 jawaban

Jawaban Terbaik

Sebelumnya, Anda memiliki banyak masalah dalam kode Anda:

  1. bgframe tidak diperpanjang dari JFrame jadi nama yang lebih baik adalah BgPanel atau BgPane mungkin karena meluas JPanel.

  2. Baik bgframe dan Frame_Accueil tidak mengikuti Konvensi penamaan Java, karena salah satunya tidak menggunakan huruf besar dan yang lainnya menggunakan kotak ular daripada kotak unta.

    • FirstWordUpperCasedClass
    • firstWordLowerCasedVariable
    • firstWordLowerCasedMethodName()
    • ALL_WORDS_UPPER_CASED_CONSTANT
  3. Anda lupa memanggil super.paintComponent(g) sebagai baris pertama paintComponent di dalam bgframe, ini dapat mengacaukan program Anda karena Swing mungkin tidak tahu apa atau bagaimana mengecat komponen bgframe pada setiap titik acak dalam eksekusi Anda.

  4. Jangan panggil setSize(...), jika Anda melakukannya, dekorasi JFrame Anda (batas dan bilah judul) sedang mempertimbangkan hal ini, jadi ukuran layar konten Anda yang sebenarnya lebih kecil dari yang Anda kira, lebih baik untuk menimpa getPreferredSize() dan kemudian memanggil pack() di JFrame Anda.

  5. Tidak perlu memperpanjang JFrame karena Anda tidak mengubah perilakunya, akan lebih baik untuk membuat instance JFrame di dalam program Anda, lihat: Memperluas JFrame vs. membuatnya di dalam program untuk penjelasan lebih mendalam tentang ini.

  6. Idk apa btn, jadi saya pikir Anda mengacu pada boutons

  7. Gambar dan aset lainnya akan menjadi embedded-resources setelah Anda mengemas aplikasi sebagai file jar, jadi sebaiknya untuk mulai memperlakukannya seperti itu, lihat jawaban ini untuk contoh yang sedang berjalan.

  8. Alih-alih mengatur ukuran yang diinginkan dari JButton Anda, Anda dapat membuat kelas terpisah yang memperluas JButton, dan menimpa getPreferredSize, seperti di JPanel seperti yang disarankan pada poin 4 di atas.

  9. Secara default JPanel memiliki FlowLayout dan dengan demikian akan mengabaikan panggilan BorderLayout.CENTER Anda, Anda dapat menggabungkan pengelola tata letak yang berbeda untuk mendapatkan output yang diinginkan, misalnya jika Anda mengubah fond tata letak ke BoxLayout itu akan dipusatkan secara vertikal karena saya pikir itulah masalah Anda.

  10. Dan yang tak kalah pentingnya, tempatkan program Anda di EDT (dan saat memposting kode ke Stack Overflow jangan lupa metode main), selengkapnya di jawaban ini

Jadi, pada akhirnya program Anda (tanpa kelas bgframe yang saya hapus sebagai latar belakang tidak diperlukan untuk masalah khusus ini) akan terlihat seperti ini:

import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FrameAccueil {
    private JFrame frame;
    
    public FrameAccueil() {
        frame = new JFrame(getClass().getSimpleName());
        
        JPanel fond = new JPanel() { // Move this code inside your bgfond class
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(1000, 500);
            }
        };
        fond.setLayout(new BoxLayout(fond, BoxLayout.PAGE_AXIS));
        
        JPanel boutons = new JPanel(new GridBagLayout());

        JButton btn1 = new JButton("btn1");
        JButton btn2 = new JButton("btn1");

        JButton btn1 = new JButton("btn1") { // If you follow point 8, these code shall be moved there and these JButtons should be objects of that class.
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 50);
            }
        };
        JButton btn2 = new JButton("btn1") {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 50);
            }
        };

        boutons.add(btn1);
        boutons.add(btn2);

        fond.add(boutons); //Try to first add the inner objects and then the outer ones, so go inside-out as to keep them ordered in a more logical way
        frame.add(fond);

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new FrameAccueil()); //Place your program on the EDT
    }
}

Dan seharusnya terlihat seperti ini (membuat layar lebih kecil)

enter image description here

2
Frakcool 5 April 2021, 17:28

Anda dapat mencoba mengatur tombol di tengah kisi Anda. Anda juga dapat menggunakan "GridBagConstraints.CENTER" dan "GridBagConstraints.HORIZONTAL"

0
JackEnChest 5 April 2021, 17:22