因此,我试图用数据库中的数据填充JTable。 youtube和SO上都有很多关于此的信息。但是我的问题是,我能找到的所有解决方案都在View Class(swing应用程序)视图中编写所有代码,这是我不允许做的事情(学校作业)。
我的问题是我无法根据MVC划分代码,但仍然可以正常工作。我从数据库中获取特定学生的方法是:
public Student getOneSpecificStudent(int studentID) throws SQLException {
Connection con = null;
PreparedStatement stm = null;
try {
con = DatabaseConnection.getConnection();
stm = con.prepareStatement("SELECT * FROM Student WHERE studentID =
?");
stm.setInt(1, studentID);
ResultSet rs = stm.executeQuery();
Student student = null;
while (rs.next()) {
student = new Student(rs.getInt("studentID"),
rs.getString("studentSSN"), rs.getString("studentName"),
rs.getString("studentAddress"), rs.getString("studentPhoneNumber"));
}
return student;
} finally {
DbUtils.close(con);
DbUtils.close(stm);
}
}
和我的Controller方法是这样的:
public Student getOneSpecificStudent(int studentID) throws SQLException {
Student student = tmpDAL.getOneSpecificStudent(studentID);
return student;
}
但是我怎么知道在Jtable中显示呢?我之前使用的Object []已经填充了数据,但是这让我很困惑。有什么想法吗?
答案 0 :(得分:1)
由于Swing已经支持MVC(以一种绕行方式),因此您应该以TableModel
开头来包装现有数据。
来自数据库的数据已经在Student
类中建模了,这是一个很好的起点,您现在只需要构建一个TableModel
并将其包装即可。您应该先查看How to Use Tables
从Student
的基本概念开始
public interface Student {
public int getID();
public String getSSN();
public String getName();
public String getAddress();
public String getPhoneNumber();
}
然后我们可以设计一个TableModel
来支持它...
public class StudentTableModel extends AbstractTableModel {
protected static final String COLUMN_NAMES[] = {
"ID", "Number", "Name", "Address", "Phone Number"
};
private List<Student> students;
public StudentTableModel(List<Student> students) {
// Prevent possible external mutation
this.students = new ArrayList<>(students);
}
@Override
public int getRowCount() {
return students.size();
}
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return Integer.class;
default: return String.class;
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Student student = students.get(rowIndex);
switch (columnIndex) {
case 0: return student.getID();
case 1: return student.getSSN();
case 2: return student.getName();
case 3: return student.getAddress();
case 4: return student.getPhoneNumber();
}
}
}
这是一个非可变模型,我将让您了解如何添加可变功能。
因此,在您看来,您将使用控制器来获取一个或多个Student
...
Student student = controller.getOneSpecificStudent(1);
然后您将为学生创建一个模型...
List<Student> students = new ArrayList<>();
students.add(student);
TableModel model = StudentTableModel(students);
然后将其应用于您的视图...
someInstanceOfJTable.setModel(model);
现在。如果需要,可以让控制器返回一个StudentTableModel
,但是我个人认为这超出了控制器的范围,因为它不应该为视图指定显示术语,这不是责任。>