在JPanel中显示JPanel数组

时间:2015-01-05 21:03:06

标签: java swing jpanel

我对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(或组件),以及这样做的正确方法。任何帮助都会非常感激,因为我现在已经坚持这个问题了一段时间。

1 个答案:

答案 0 :(得分:1)

不要在内容窗格上使用空布局。让内容窗格占用框架可用的所有空间。

  

我发现字符串是唯一会出现在studentPane上的东西。

这句话绝对没有意义。字符串不是组件,不能添加到JPanel。您的代码当前添加了一个JLabel,其中包含面板的toString()表示。

将组件动态添加到可见GUI的一般代码是:

panel.add(...);
panel.revalidate(); // invoke layout manager
panel.repaint(); paint all components

默认情况下,组件的大小为(0,0),因此在调用布局管理器之前,无需绘制任何内容。