我对Swing有点新手,我在尝试在JPanel中显示JPanel数组时遇到了问题。
程序根据用户输入的信息将Student对象添加到Driver类中的arraylist,然后应该在studentPane JPanel中的单独JPanel上显示该信息,但是在放入信息之后它们永远不会出现
我尝试的第一件事是让Student类通过创建一个名为getInfoPane的方法返回一个JPanel,该方法返回在学生类中创建的JPanel及其所有必要信息,然后调用:
studentPane.add(students.get(x).getInfoPane());
但那没用。我也试过让Student类扩展JPanel,将学生的信息添加到该面板,然后尝试将它添加到Driver类中的studentPane JPanel,它也不会显示。
目前,我正在尝试使用名为StudentInfo的单独的JPAnels arraylist,并为学生添加此代码:
for(int x=0; x<Integer.parseInt(numberField.getText()); x++) {
studentInfo.add(new JPanel ()); //add new JPanel to array
studentInfo.get(x).add(new JLabel (students.get(x).toString())); //add info from Student
studentPane.add(studentInfo.get(x)); //add JPanel with student info to main Student JPanel
}
重写了toString方法,返回一个字符串,其中输入的信息输入到Student类中。这种方法也没有用。我已经检查过以确保学生班级正在接收所输入的信息,并打印出来。我还试图直接将组件(如JLabel)添加到Driver类中的studentPane但是,但它不起作用。经过一些测试后,我发现字符串是唯一可以出现在studentPane上的东西。这让我认为问题涉及的是除了从另一个类传递JPanel之外的其他事情。我已经查看了许多其他类似问题的问题,但未能使解决方案适用于我的程序。
到目前为止,这是我程序中的相关代码:
public class Driver extends JFrame {
private Container contentPane;
ArrayList<Student> students = new ArrayList<Student>();
private JPanel studentPane = new JPanel();
ArrayList<JPanel> studentInfo = new ArrayList<JPanel>();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Driver frame = new Driver();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Driver() {
contentPane = this.getContentPane();
profiles.add(addStudentProfiles); // this chunk has the user input student info and tries to add it to studentPane
addStudentProfiles.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, number, "Number to create", JOptionPane.INFORMATION_MESSAGE );
if(numberField.getValue() != null) {
for(int x=0; x<Integer.parseInt(numberField.getText()); x++) {
while(nameField.getText().equals("") || workEthicField.getText().equals("")) {
JOptionPane.showMessageDialog(null, studentInputs, "New Student", JOptionPane.PLAIN_MESSAGE);
if(nameField.getText().equals("") || workEthicField.getText().equals(""))
JOptionPane.showMessageDialog(null, "Error. Please fill out all of the fields");
}
students.add(new Student(nameField.getText(), Integer.parseInt(workEthicField.getText()), (String)(major1Field.getSelectedItem())));
nameField.setText(""); workEthicField.setValue(null);
}
for(int x=0; x<Integer.parseInt(numberField.getText()); x++) {
studentInfo.add(new JPanel ());
studentInfo.get(x).add(new JLabel (students.get(x).toString()));
studentPane.add(studentInfo.get(x));
}
numberField.setValue(null);
}
}
});
setContentPane(contentPane);
contentPane.setLayout(null);
studentPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createMatteBorder(3, 3, 3, 3, Color.black), "Students", TitledBorder.CENTER, TitledBorder.CENTER));
studentPane.setLocation(350, 0);
studentPane.setSize(300, (int)getBounds().getHeight()-62);
studentPane.setBackground(Color.lightGray);
studentPane.setVisible(true);
contentPane.add(studentPane);
}
}
这是学生班:
public class Student {
private String name, major;
private int workEthic;
private String info = "";
public Student(String name, int workEthic, String major) {
this.name = name;
this.workEthic = workEthic;
this.major = major;
info = name+ "\n" +major+ "\n" +workEthic;
}
public String toString() {
return info;
}
}
所以基本上,我只是想知道为什么程序不会在studentPane JPanel(位于整个contentPane容器内)中显示JPanels(或组件),以及这样做的正确方法。任何帮助都会非常感激,因为我现在已经坚持这个问题了一段时间。
答案 0 :(得分:1)
不要在内容窗格上使用空布局。让内容窗格占用框架可用的所有空间。
我发现字符串是唯一会出现在studentPane上的东西。
这句话绝对没有意义。字符串不是组件,不能添加到JPanel。您的代码当前添加了一个JLabel,其中包含面板的toString()表示。
将组件动态添加到可见GUI的一般代码是:
panel.add(...);
panel.revalidate(); // invoke layout manager
panel.repaint(); paint all components
默认情况下,组件的大小为(0,0),因此在调用布局管理器之前,无需绘制任何内容。