来自另一个 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);
}
这是我的主框架代码
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);
}