来自另一个 class 的 JPanel 不会出现在主 JFrame 中

JPanel from another class wont appear in main JFrame

这是我的主框架代码

import javax.swing.*;
import java.awt.*;

public class MainGUI extends JFrame {

    cPanel cP = new cPanel();

    public static void main(String[] args) {
        MainGUI main = new MainGUI();
        main.setVisible(true);
    }

    private MainGUI(){
        setTitle("X");
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        add(cP);
    }   


}

然后是我的JPanel代码

import java.awt.GridLayout;
import javax.swing.*;

public class cPanel extends JPanel{

//cPanel
    JPanel cP1 = new JPanel();

//Panel 1
    JLabel lb1 = new JLabel("dx");
    JLabel lb1dx = new JLabel("dx (pixel)");
    JTextField tf1dx = new JTextField(5);
    JLabel lb1dy = new JLabel("dy (pixel)");
    JTextField tf1dy = new JTextField(5);
    JButton btn1 = new JButton("move");


    public void cPanel(){
        setBounds(0, 0, 600, 190);
        setLayout(new GridLayout(1, 8));
        add(cP1);

    //Panel 1   
        cP1.add(lb1);
        cP1.add(lb1dx);
        cP1.add(tf1dx);
        tf1dx.setText("10");
        cP1.add(lb1dy);
        cP1.add(tf1dy);
        tf1dy.setText("10");
        cP1.add(btn1);
    }

}

面板好像没有出现。框架出现时有标题但没有大小,向框架添加 pack() 没有任何作用。我尝试了很多方法,包括制作一个新的 class 来尝试,我的代码有什么问题?

public void cPanel(){ //get rid of void as it is a constructor not a method.
//public cPanel(){ instead
    setBounds(0, 0, 600, 190);
    setLayout(new GridLayout(1, 8));
    add(cP1);


private MainGUI(){
    setTitle("X");
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(null); //change this to setSize(500, 200) or something.
    add(cP);
}   

正如 Berger 所建议的:使用 getContentPane()

import javax.swing.*;
import java.awt.*;

public class MainGUI extends JFrame {

cPanel cP = new cPanel();

public static void main(String[] args) {
    MainGUI main = new MainGUI();
    main.setVisible(true);
}

private MainGUI(){
    setTitle("X");
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(800,600);
    getContentPane().add(cP);
}   

}

问题是因为 cPanel 的错误实现 class。您在 cPanel class 而不是构造函数中创建了一个方法。构造函数不能有 return 类型,进行以下更改,它应该可以工作。

public cPanel(){
    setBounds(0, 0, 600, 190);
    setLayout(new GridLayout(1, 8));
    add(cP1);

//Panel 1   
    cP1.add(lb1);
    cP1.add(lb1dx);
    cP1.add(tf1dx);
    tf1dx.setText("10");
    cP1.add(lb1dy);
    cP1.add(tf1dy);
    tf1dy.setText("10");
    cP1.add(btn1);
}