这就是如何在screen类中创建带有表的面板。
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
实际上,你从来没有添加任何内容。因此,您只需在选项卡窗格中添加一个空面板。
您需要在某个时候将表实际添加到面板中。所以回到
学生桌
类和添加
add(table)
在
createTable()
方法或者,如果要在构造函数中调用createTable(),也可以在构造函数的createTable()下面添加这一行。
public StudentTable() {
createTable();
add(table);
}
你现在能看到桌子吗?是的,你可以。你能看到表中的所有值吗?不,你不能。这是因为表格不可滚动。您需要将其添加到
ScrollPane
.
最简单的方法是创建一个
在
学生桌
Table
到
然后添加
滚动窗格
到
面板
回到你曾经写过的地方
在
学生桌
类别和
代替
具有
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
add(scrollPane);
这应该可以暂时解决您的问题。
另外,我想指出,您使用了太多的类字段。例如
学生桌
班
name
,
lastName
,
letterGrade
,
studentId
,
quiz1
,
quiz2
,
project
,
midterm
,
finalGrade
,
average
和
scanner
作为一个领域是没有用的。除了一个之外,所有属性都不是表的属性,它们不代表表的实例。它们代表一个
Student
我建议你看看
this answer
一个相关的问题。
永远不要使用字段来简化从一个方法到另一个方法的数据传递。这根本不是它的目的。这样做也会使方法本身不安全或需要同步。
您也不需要
main()
方法。当它启动时,它只是作为代码的入口点,就是这样。
关于getter和setter,只添加您需要的。你的
screen
类不访问
学生桌
类(可以理解,因为它们中的大多数都是不合理的,对其他类来说完全没有用),但是它们中的每一个都有一个getter和setter。
如果你有很多getter和setter,把它们放在最后,这就不需要滚动20分钟来访问类中的任何实际实现。
学生桌
班
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;
}
}