ฉันจะเพิ่ม JButtons และ JLabels โดยไม่มีข้อขัดแย้งได้อย่างไร

เมื่อฉันพยายามเพิ่ม JButton และ JLabel ลงใน JFrame ทั้งคู่ขัดแย้งกันโดยที่ JButtons ทั้งหมดจะหายไปและมีเพียง JLabel เท่านั้นที่จะมองเห็นได้ JLabel ด้วยเหตุผลบางอย่างจะไปที่ด้านซ้ายสุดของ JFrame แทนที่จะเป็นตำแหน่งที่ต้องการที่ฉันตั้งค่าให้ไป ฉันยังใหม่กับเนื้อหาที่เกี่ยวข้องกับ GUI และฉันยินดีที่จะเรียนรู้จากข้อผิดพลาดเหล่านี้

นี่คือรหัสของฉัน:

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 แหล่งที่มา
comment
เพราะทุกปุ่มมีตำแหน่งเดียวกันในวิธี setBounds ตรวจสอบขอบเขตการตั้งค่า b1,b2,b3 ของคุณ นอกจากนี้อย่าพยายามใช้เลย์เอาต์แบบ null แทน ให้ฝึกฝนกับตัวจัดการเลย์เอาต์อื่น ๆ ที่จัดทำโดย java docs.oracle.com/javase/tutorial/uiswing/layout/using HTML   -  person Vighanesh Gursale    schedule 21.03.2015
comment
พวกมันทั้งหมดมีตำแหน่งของ x เหมือนกัน แต่ต่างสถานที่ สิ่งเดียวที่ปรากฏคือชื่อ: ซึ่งก็คือ JLabel ไม่มี Jbuttons แสดงอยู่   -  person Dino Calandra    schedule 21.03.2015
comment
สิ่งแรกคือ Windowb คืออะไร คุณกำลังพยายามเพิ่มส่วนประกอบบนวัตถุ simple ซึ่งเป็นของ Windowb โปรดปฏิบัติตามกฎง่ายๆ ในการเพิ่มส่วนประกอบ โปรดอ่านบทความเหล่านี้ docs.oracle.com/javase/tutorial/uiswing/ start/index.html   -  person Vighanesh Gursale    schedule 21.03.2015
comment
ปัญหา #1 คุณกำลังใช้เลย์เอาต์ที่เป็นโมฆะ เตรียมพร้อมสำหรับปัญหาและปัญหาที่ไม่มีที่สิ้นสุด ซึ่งเราจะไม่ช่วยคุณแก้ไข เนื่องจากคุณควรใช้เลย์เอาต์ที่เหมาะสม ไม่มีเหตุผลใดที่จะไม่ทำเช่นนั้น ปัญหา #2 คุณทำให้หน้าต่างเลวร้ายก่อนที่คุณจะสร้าง UI พื้นฐานเสร็จ โดยปกติ เราขอแนะนำให้ใช้การตรวจสอบความถูกต้องอีกครั้งเพื่อแก้ไข แต่สิ่งนี้เกี่ยวข้องกับ API โครงร่าง ดังนั้นจึงใช้งานไม่ได้ที่นี่   -  person MadProgrammer    schedule 21.03.2015
comment
โอเค ฉันตั้งค่าเค้าโครงเป็น setLayout(new BorderLayout()) ตอนนี้ JButtons ปรากฏขึ้น แต่ก็ยังไม่อนุญาตให้ฉันวางตำแหน่ง JLabel ในจุดที่ฉันต้องการให้เป็น   -  person Dino Calandra    schedule 21.03.2015


คำตอบ (1)


คุณควรใช้ LayoutManager ดูบทช่วยสอนตัวจัดการเค้าโครง: http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

setBounds() ถูกใช้โดยตัวจัดการโครงร่างเพื่อวางตำแหน่งส่วนประกอบ คุณสามารถตั้งค่า LayoutManager ให้เป็นโมฆะและวางตำแหน่งส่วนประกอบด้วยตนเองได้ แต่สิ่งต่างๆ เช่น การปรับขนาดหน้าต่างจะไม่ได้รับการจัดการสำหรับคุณในลักษณะนั้น (เช่น ส่วนประกอบและพื้นที่ไม่ได้รับการปรับขนาดตามนั้น) หากคุณต้องการรักษาสุขภาพจิตของคุณ อย่าใช้ build ในเค้าโครง GridBag! มันจะทำให้คุณเป็นบ้า! สำหรับรูปแบบที่ซับซ้อนมากขึ้น ให้ใช้ http://www.miglayout.com/ หรือ http://www.jgoodies.com/freeware/libraries/forms/ สำหรับเลย์เอาต์แบบธรรมดา ให้ใช้ตัวจัดการเลย์เอาต์ เช่น BorderLayout

หากคุณไม่ต้องการใช้ตัวจัดการเค้าโครงจริงๆ ให้ใช้ JPanel JFrame สามารถเก็บองค์ประกอบได้เพียงชิ้นเดียวเท่านั้นนั่นคือปัญหาของคุณ วาง JPanel ไว้ใน JFrame และใส่ส่วนประกอบของคุณลงใน JPanel

person Jasper Siepkes    schedule 21.03.2015