Bagaimana cara menambahkan JButtons dan JLabels tanpa konflik?

Saat saya mencoba menambahkan JButton dan JLabel ke dalam JFrame, keduanya saling bertentangan di mana semua JButton akan hilang dan hanya JLabel yang terlihat. JLabel karena alasan tertentu akan mengarah ke sisi paling kiri JFrame alih-alih ke lokasi yang diinginkan yang saya atur. Saya baru mengenal materi terkait GUI dan saya bersedia belajar dari kesalahan ini.

Ini kode saya:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Windowb extends JFrame{
    static String title = "This is a JFrame";
    static int width = 500;
    static int height = 400;

    private static final int BUTTON_LOCATION_X = 46;
    private static final int BUTTON_LOCATION_Y = 80;

    public static void main(String[]args){
        Windowb simple = new Windowb(title, width, height);
        JPanel p = new JPanel(); 
        p.setLayout(null);
        JLabel c1 = new JLabel("Name: ");
        JButton b1 = new JButton("Name:");
        JButton b2 = new JButton("Grade:");
        JButton b3 = new JButton("GPA");
        b1.setBounds(BUTTON_LOCATION_X, BUTTON_LOCATION_Y, 90, 20);
        b2.setBounds(50, 170, 90, 20);
        b3.setBounds(50, 240, 90, 20);
        c1.setLocation(100, 250);

        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "ActionListener is working!");
            }

        });


        b2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            JOptionPane.showMessageDialog(null, "The second one works too!");
            }
        });

        b3.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "Surprise!");
            }
        });
        p.add(b1); 
        p.add(b2); 
        p.add(b3);
        simple.add(p);
        simple.add(c1);
    }

    public Windowb(String t, int w, int h){
        setVisible(true);
        setResizable(true);
        setSize(w, h);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocation(500, 100);
        setTitle(t);
    }
}

person Dino Calandra    schedule 21.03.2015    source sumber
comment
karena setiap tombol memiliki lokasi yang sama dalam metode setBounds. periksa b1,b2,b3 batas set Anda. Juga jangan mencoba menggunakan tata letak nol, melainkan teruslah berlatih dengan pengelola tata letak lain yang disediakan oleh Java. docs.Oracle.com/javase/tutorial/uiswing/layout/using. html   -  person Vighanesh Gursale    schedule 21.03.2015
comment
semuanya memiliki lokasi x yang sama. tapi lokasinya berbeda. Satu-satunya hal yang ditampilkan adalah Nama: yang merupakan JLabel. Tidak ada tombol J yang ditampilkan.   -  person Dino Calandra    schedule 21.03.2015
comment
Hal pertama apa itu Windowb. Anda mencoba menambahkan komponen pada objek simple milik Windowb. Harap ikuti beberapa aturan sederhana dalam menambahkan komponen. Silakan baca artikel ini docs.Oracle.com/javase/tutorial/uiswing/ mulai/index.html   -  person Vighanesh Gursale    schedule 21.03.2015
comment
Masalah #1 Anda menggunakan tata letak nol, bersiaplah untuk masalah dan masalah yang tiada habisnya, yang mana kami tidak akan membantu Anda memperbaikinya, karena Anda harus menggunakan tata letak yang sesuai, tidak ada alasan untuk tidak melakukannya; Masalah #2 Anda membuat jendela menjadi jelek sebelum Anda selesai membuat UI dasar. Biasanya, kami menyarankan penggunaan validasi ulang untuk memperbaikinya, tetapi ini berkaitan dengan api tata letak, jadi ini tidak akan berfungsi di sini   -  person MadProgrammer    schedule 21.03.2015
comment
oke, saya mengatur tata letaknya ke setLayout(new BorderLayout()), JButtons sekarang muncul tetapi masih tidak memungkinkan saya untuk memposisikan JLabel di tempat yang saya inginkan.   -  person Dino Calandra    schedule 21.03.2015


Jawaban (1)


Anda mungkin harus menggunakan LayoutManager. Lihat tutorial pengelola tata letak: http://docs.Oracle.com/javase/tutorial/uiswing/layout/visual.html

setBounds() digunakan oleh pengelola tata letak untuk memposisikan komponen. Anda dapat mengatur LayoutManager ke null dan memposisikan komponen sendiri, tetapi hal-hal seperti pengubahan ukuran jendela tidak ditangani untuk Anda seperti itu (yaitu komponen dan ruang tidak diskalakan sesuai). Jika Anda ingin menjaga kewarasan Anda maka jangan gunakan build in GridBag layout! Itu akan membuatmu gila! Untuk tata letak yang lebih kompleks gunakan http://www.miglayout.com/ atau http://www.jgoodies.com/freeware/libraries/forms/ . Untuk tata letak sederhana gunakan pengelola tata letak seperti BorderLayout.

Jika Anda benar-benar tidak ingin menggunakan layoutmanager maka gunakan JPanel. JFrame hanya dapat menampung satu komponen, jadi itulah masalah Anda. Letakkan JPanel di dalam JFrame dan letakkan komponen Anda di JPanel.

person Jasper Siepkes    schedule 21.03.2015