2017-11-18 369 views
0

我正在写一个图形用户界面,显示800学生的表格,学生的信息从txt文件中读取。我编写了Screen()类和StudentTable()类,其中Screen类具有带两个JPanel选项卡“PList”和“PChart”的TabbedPane。我想将我的StudentTable类添加到我的PList JPanel中。所以当我运行Screen类时,它将显示里面有学生表的StudentTable类。通常情况下,我设法显示我的表没有标签。 首先,我打开“Students.txt”文件,然后阅读文件。然后我关闭了文件。之后,我创建了一个void方法createTable(),它创建表格。该表从ArrayList获取信息。现在,我想将这个类添加到我的PList JPanel。代码有点长。所以我上传了他们。但是,如果你想让我分享代码,我也可以。
Screen.java如何将JTable添加到JTabbedPane中?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

public class Screen extends JFrame implements ActionListener { 
    private JTabbedPane tabbedPane; 
    private JPanel PList, PChart; 
    private JMenuBar menuBar; 
    private JMenu menuStudent, menuSort, menuFilter; 
    private JMenuItem addStudent, removeStudent, removeAllStudents; 
    private JMenuItem sortLastName, sortId, sortAverage; 
    private JMenuItem filterLetterGrade, removeFilter; 

    private StudentTable studentTable; 

    public Screen() { 
     // TODO Auto-generated constructor stub 
     tabbedPane = new JTabbedPane(); 
     menuBar = new JMenuBar(); 
     menuStudent = new JMenu(); 
     menuSort = new JMenu(); 
     menuFilter = new JMenu(); 
     addStudent = new JMenuItem(); 
     removeStudent = new JMenuItem(); 
     removeAllStudents = new JMenuItem(); 
     sortLastName = new JMenuItem(); 
     sortId = new JMenuItem(); 
     sortAverage = new JMenuItem(); 
     filterLetterGrade = new JMenuItem(); 
     removeFilter = new JMenuItem();  
     PList = new JPanel(); 
     PChart = new JPanel(); 

     studentTable = new StudentTable(); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     setExtendedState(MAXIMIZED_BOTH); 
     setTitle("Screen"); 
     setLayout(new BorderLayout()); 
     setJMenuBar(menuBar); 

     // Menu 
     menuStudent.setText("Student"); 
     addStudent.setText("Add Student"); 
     addStudent.addActionListener(this); 
     removeStudent.setText("Remove Student"); 
     removeStudent.addActionListener(this); 
     removeAllStudents.setText("Remove All Students"); 
     removeAllStudents.addActionListener(this); 
     menuStudent.add(addStudent); 
     menuStudent.add(removeStudent); 
     menuStudent.add(removeAllStudents); 

     menuSort.setText("Sort"); 
     sortLastName.setText("Sort by last name"); 
     sortLastName.addActionListener(this); 
     sortId.setText("Sort by ID"); 
     sortId.addActionListener(this); 
     sortAverage.setText("Sort by average"); 
     sortAverage.addActionListener(this); 
     menuSort.add(sortLastName); 
     menuSort.add(sortId); 
     menuSort.add(sortAverage); 

     menuFilter.setText("Filter"); 
     filterLetterGrade.setText("Filter by letter grade"); 
     filterLetterGrade.addActionListener(this); 
     removeFilter.setText("Remove filter"); 
     removeFilter.addActionListener(this); 
     menuFilter.add(filterLetterGrade); 
     menuFilter.add(removeFilter); 

     menuBar.add(menuStudent); 
     menuBar.add(menuSort); 
     menuBar.add(menuFilter); 

     // Tabs 
     tabbedPane.add("List", PList); 
     tabbedPane.add("Chart", PChart); 
     add(tabbedPane); 
     PList.add(studentTable); 

    } 

    public static void main(String[] args) { 
     new Screen(); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

StudentTable.java

import java.net.URL; 
import java.util.ArrayList; 
import java.util.Scanner; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 

public class StudentTable extends JPanel { 

    private static JTable table; 
    private String name, lastName, letterGrade; 
    private long studentId; 
    private double quiz1,quiz2,project,midterm,finalGrade,average; 
    private static ArrayList<Students> studentList; 
    private Scanner scanner; 

    public StudentTable() { 
    } 

    /** 
    * 
    * @param name 
    * @param lastName 
    * @param studentId 
    * @param quiz1 
    * @param quiz2 
    * @param project 
    * @param midterm 
    * @param finalGrade 
    * @param average 
    * @param letterGrade 
    */ 
    public StudentTable(String name, String lastName, long studentId, double quiz1, double quiz2, double project, double midterm, double finalGrade, double average, String letterGrade) { 
     this.name = name; 
     this.lastName = lastName; 
     this.letterGrade = letterGrade; 
     this.studentId = studentId; 
     this.quiz1 = quiz1; 
     this.quiz2 = quiz2; 
     this.project = project; 
     this.midterm = midterm; 
     this.finalGrade = finalGrade; 
     this.average = average; 
    } 

    // GET & SET METHODS 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public String getLetterGrade() { 
     return letterGrade; 
    } 
    public void setLetterGrade(String letterGrade) { 
     this.letterGrade = letterGrade; 
    } 
    public long getStudentId() { 
     return studentId; 
    } 
    public void setStudentId(long studentId) { 
     this.studentId = studentId; 
    } 
    public double getQuiz1() { 
     return quiz1; 
    } 
    public void setQuiz1(double quiz1) { 
     this.quiz1 = quiz1; 
    } 
    public double getQuiz2() { 
     return quiz2; 
    } 
    public void setQuiz2(double quiz2) { 
     this.quiz2 = quiz2; 
    } 
    public double getProject() { 
     return project; 
    } 
    public void setProject(double project) { 
     this.project = project; 
    } 
    public double getMidterm() { 
     return midterm; 
    } 
    public void setMidterm(double midterm) { 
     this.midterm = midterm; 
    } 
    public double getFinalGrade() { 
     return finalGrade; 
    } 
    public void setFinalGrade(double finalGrade) { 
     this.finalGrade = finalGrade; 
    } 
    public double getAverage() { 
     return average; 
    } 
    public void setAverage(double average) { 
     this.average = average; 
    } 
    public ArrayList<Students> getStudentList() { 
     return studentList; 
    } 
    public void setStudentList(ArrayList<Students> studentList) { 
     this.studentList = studentList; 
    } 

    // Opening "Students.txt" file from a url. 
    public void openFile() { 
     try { 
      URL url = new URL("http://rawsly.com/Students.txt"); 
      scanner = new Scanner(url.openStream()); 
     } catch (Exception e) { 
      // TODO: handle exception 
      System.out.println("Error: " + e.getMessage()); 
     } 
    } 

    // Reading "Students.txt" file and adding students to the "studentList" ArrayList. 
    public void readFile() { 
     studentList = new ArrayList<>(); 
     while(scanner.hasNext()) { 
      name = scanner.next(); 
      lastName = scanner.next(); 
      studentId = scanner.nextLong(); 
      quiz1 = scanner.nextDouble(); 
      quiz2 = scanner.nextDouble(); 
      project = scanner.nextDouble(); 
      midterm = scanner.nextDouble(); 
      finalGrade = scanner.nextDouble(); 
      average = scanner.nextDouble(); 
      letterGrade = scanner.next(); 
      studentList.add(new Students(name, lastName, studentId, quiz1, quiz2, project, midterm, finalGrade, average, letterGrade)); 
     } 
    } 

    // Closing "Students.txt" file. 
    public void closeFile() { 
     scanner.close(); 
    } 

    public void createTable() { 
     openFile(); 
     readFile(); 
     closeFile(); 
     String [] columnNames = {"NAME", "SURNAME", "ID", "QUIZ1", "QUIZ2", "PROJECT", "MIDTERM", "FINAL", "AVERAGE", "LETTER GRADE"}; 
     Object [][] data = new Object[studentList.size()][10]; 
     for(int i=0; i<studentList.size(); i++) { 
      for(int j=0; j<10; j++) { 
       switch (j) { 
       case 0: 
        data[i][0] = studentList.get(i).getName(); 
        break; 
       case 1: 
        data[i][1] = studentList.get(i).getLastName(); 
        break; 
       case 2: 
        data[i][2] = studentList.get(i).getStudentId(); 
        break; 
       case 3: 
        data[i][3] = studentList.get(i).getQuiz1(); 
        break; 
       case 4: 
        data[i][4] = studentList.get(i).getQuiz2(); 
        break; 
       case 5: 
        data[i][5] = studentList.get(i).getProject(); 
        break; 
       case 6: 
        data[i][6] = studentList.get(i).getMidterm(); 
        break; 
       case 7: 
        data[i][7] = studentList.get(i).getFinalGrade(); 
        break; 
       case 8: 
        data[i][8] = studentList.get(i).getAverage(); 
        break; 
       case 9: 
        data[i][9] = studentList.get(i).getLetterGrade(); 
        break; 
       } // end of the switch 
      } // end of the first for loop 
     } // end of the second for loop 

     table = new JTable(data,columnNames) { 
      public boolean isCellEditable(int row, int column) { // To make row and columns not editable 
       return false; 
      } 
     }; 
     table.setFillsViewportHeight(true); 
     table.setAutoCreateRowSorter(true); // to activate sorting property of each column 
    } 

    public static void main(String[] args) { 
     StudentTable s = new StudentTable(); 
     s.createTable(); 
    } 
} 
+1

请将您的代码发布在问题中。其次,你对创建的JTable没有做任何事情,所以至少在StudentTable中添加一个getter,用它来获取'Screen'中的'JTable',并将JTable'添加到适当的面板中。第三,重新思考你的代码两次,其中有许多不好的事情。 –

+0

好的,我会再次处理它。感谢您的建议。 :) – rawsly

+0

我看到你正在用'PList.add(studentTable);'来添加表格。究竟是什么问题? – c0der

回答

1

这是你如何创建与屏幕类的表的面板。

studentTable = new StudentTable(); 

这是StudentTable的构造函数的外观。

public StudentTable() {} 

你在这里看到问题了吗?你正在调用一个空构造函数。

您可以尝试通过实际创建表来修复它,无论是在表构造函数中,还是在对象上明确调用createTable()

所以要么在Screen呢。

// Tabs 
tabbedPane.add("List", PList); 
tabbedPane.add("Chart", PChart); 
add(tabbedPane); 
studentTable.createTable(); // Create the table 
PList.add(studentTable); 
validate(); // Revalidate the frame 

还是在创建的StudentTable类表。

public StudentTable() { 
    createTable(); 
} 

看,那很简单。它现在工作吗?不是真的。 StudentTable是Panel,你永远不会添加任何东西。所以你只需要在你的TabbedPane中添加一个空的面板。

您需要在某个时刻将表格添加到Panel中。因此请回到StudentTable类,并在createTable()方法的末尾添加add(table)。或者,如果您在构造函数中调用createTable(),则还可以在构造函数中添加此行,在createTable()下方。

public StudentTable() { 
    createTable(); 
    add(table); 
} 

你现在可以看到一张表吗?是的你可以。你能看到表中的所有值吗?你不能。这是因为表格不可滚动。您需要将其添加到ScrollPane

最简单的方法是在StudentTable类中创建一个ScrollPane。将Table添加到ScrollPane,然后将ScrollPane添加到Panel

回到你在哪里都在StudentTable类写道add(table)替换为

JScrollPane scrollPane = new JScrollPane(table); 
table.setFillsViewportHeight(true); 
add(scrollPane); 

这应该可以解决您现在的问题。

作为一个补充,我想指出你使用太多的类字段。例如在StudentTable类,namelastNameletterGradestudentIdquiz1quiz2projectmidtermfinalGradeaveragescanner有没有用作为一个字段。除了一个以外,其他都不是表格的属性,它们不代表表格的一个实例。他们代表一个Student我建议你看看this answer到相关的问题。

您不应该使用字段来简化将数据从一种方法传递到另一种方法。这根本不是它的目的。这样做也会使您的方法内在地线程不安全或需要同步。

您也不需要在每个班级中使用main()方法。它只是在代码启动时作为代码的入口点,就是这样。

关于吸气剂和吸气剂,只添加你需要的。你的screen类不会访问StudentTable类中的任何字段(可以理解,因为其中大多数都没有合理性,并且对其他类完全无用),但是对于每个类都有一个getter和setter。 如果你确实有很多getter和setter,把它们放在最后,这样就不用滚动20分钟就可以访问类中的任何实际实现。

这里是我将如何写StudentTable类。

import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Scanner; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 

public class StudentTablePanel extends JPanel { 

    private static JTable table; 

    public StudentTablePanel() { 
     table = createTable(getStudentList()); // This line—in my opinion—makes it more immediately understandable what is happening, you're creating a table from a list of students. 
     JScrollPane scrollPane = new JScrollPane(table); 
     table.setFillsViewportHeight(true); 
     add(scrollPane); 
    } 

    // Reading "Students.txt" file and adding students to the "studentList" ArrayList. 
    public ArrayList<Students> getStudentList() { 
     ArrayList<Students> list = new ArrayList<>(); 
     try (Scanner scanner = new Scanner(new URL("http://rawsly.com/Students.txt").openStream())) { // Try with resources loop automatically closes the scanner when done 
      while (scanner.hasNext()) { 
       String name = scanner.next(); 
       String lastName = scanner.next(); 
       long studentId = scanner.nextLong(); 
       double quiz1 = scanner.nextDouble(); 
       double quiz2 = scanner.nextDouble(); 
       double project = scanner.nextDouble(); 
       double midterm = scanner.nextDouble(); 
       double finalGrade = scanner.nextDouble(); 
       double average = scanner.nextDouble(); 
       String letterGrade = scanner.next(); 
       list.add(new Students(name, lastName, studentId, quiz1, quiz2, project, midterm, finalGrade, average, letterGrade)); 
      } 
     } catch (IOException ex) { 
      // Handle your exception 
     } 
     return list; 
    } 

    public JTable createTable(ArrayList<Students> studentList) { 
     String[] columnNames = {"NAME", "SURNAME", "ID", "QUIZ1", "QUIZ2", "PROJECT", "MIDTERM", "FINAL", "AVERAGE", "LETTER GRADE"}; 
     int row = studentList.size(); 
     int column = columnNames.length; 
     Object[][] data = new Object[row][column]; 
     for (int i = 0; i < row; i++) { 
      for (int j = 0; j < column; j++) { 
       switch (j) { 
        case 0: 
         data[i][0] = studentList.get(i).getName(); 
         break; 
        case 1: 
         data[i][1] = studentList.get(i).getLastName(); 
         break; 
        case 2: 
         data[i][2] = studentList.get(i).getStudentId(); 
         break; 
        case 3: 
         data[i][3] = studentList.get(i).getQuiz1(); 
         break; 
        case 4: 
         data[i][4] = studentList.get(i).getQuiz2(); 
         break; 
        case 5: 
         data[i][5] = studentList.get(i).getProject(); 
         break; 
        case 6: 
         data[i][6] = studentList.get(i).getMidterm(); 
         break; 
        case 7: 
         data[i][7] = studentList.get(i).getFinalGrade(); 
         break; 
        case 8: 
         data[i][8] = studentList.get(i).getAverage(); 
         break; 
        case 9: 
         data[i][9] = studentList.get(i).getLetterGrade(); 
       } // end of the switch 
      } // end of the first for loop 
     } // end of the second for loop 

     JTable newTable= new JTable(data, columnNames) { 
      @Override 
      public boolean isCellEditable(int row, int column) { // To make row and columns not editable 
       return false; 
      } 
     }; 
     newTable.setFillsViewportHeight(true); 
     newTable.setAutoCreateRowSorter(true); // to activate sorting property of each column 

     return newTable; 
    } 
} 
+0

你真了不起!非常感谢您的意见!我会非常仔细地研究你的解释。 – rawsly