已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
3小时前关门了。
Improve this question
我正在写一个关于管理学生的程序,但是当我添加一个新学生时,模型仍然获得所有数据,但是JTable没有显示新添加的学生。我花了更多的时间来修复和检测错误,但是我什么也没有得到。谁能帮助我解决这个问题?
下面是我的代码。
package javaswing;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
*
* @author ADMIN
*/
public class StudentModelTable extends AbstractTableModel {
private ArrayList<Student> data = new ArrayList<>();
private String[] columnNames;
public StudentModelTable(ArrayList<Student> studentList) {
super();
data = studentList;
columnNames = new String[]{"MHS", "Họ và tên", "Điểm", "Địa chỉ", "Ghi chú"};
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Student student = data.get(rowIndex);
return switch (columnIndex) {
case 0 ->
student.getStudentCode();
case 1 ->
student.getFullname();
case 2 ->
student.getScore();
case 3 ->
student.getAddress();
case 4 ->
student.getNotice();
default ->
null;
};
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
//set value at a particular cell
public void setValueAt(Student student, int row, int column) {
data.add(row, student);
fireTableCellUpdated(row, column);
}
}
在这里,代码绘制表格
private void viewListStudentActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
addStudent.setBorderPainted(false);
updateStudent.setBorderPainted(false);
viewListStudent.setBorderPainted(true);
import_export.setBorderPainted(false);
jTabbedPane1.setSelectedIndex(2);
try {
Launcher.dataTable = Util.readDataBinary();
JTable tableStudennt = new JTable();
if (Launcher.dataTable != null) {
Launcher.dataTable = Util.sortArrayList(Launcher.dataTable, 0);
// thiết lập data cho JTable
this.modelTable = new StudentModelTable(Launcher.dataTable);
System.out.println(this.modelTable.getRowCount());
// vẽ JTable vào tab
tableStudennt = new JTable(this.modelTable);
} else {
// Nếu dữ liệu null cần set table default
tableStudennt.setModel(new DefaultTableModel(
new Object[][]{
{null, null, null, null, null, null, null},}, new String[]{"MHS", "Họ và tên", "Điểm", "Địa chỉ", "Ghi chú"}
));
}
tableStudennt.setColumnSelectionAllowed(false);
tableStudennt.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(tableStudennt);
// thiết lập comboBox
String[] modeStudentCode = {"MHS tăng dần", "MHS giảm dần", "Điểm tăng dần", "Điểm giảm dần"};
JComboBox comboxStudentCode = new JComboBox(modeStudentCode);
comboxStudentCode.setSelectedIndex(0);
comboxStudentCode.setEditable(false);
comboxStudentCode.addActionListener((java.awt.event.ActionEvent evt1) -> {
Launcher.dataTable = Util.sortArrayList(Launcher.dataTable, comboxStudentCode.getSelectedIndex());
this.modelTable.fireTableDataChanged();
});
tab4.add(comboxStudentCode, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 120, -1, -1));
tab4.add(scrollPane, new AbsoluteConstraints(0, 160, 780, 400));
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex);
}
}
2条答案
按热度按时间uqjltbpv1#
您不是重写类
AbstractTableModel
中的setValueAt方法,因为该方法中第一个参数的类型是Object
而不是Student
。因此你的
setValueAt
方法,在StudentModelTable
类中,可能没有被调用,而是AbstractTableModel
类中的方法。setValueAt
方法,在AbstractTableModel
类中,什么也不做。方法体是空的。这就是为什么使用@Override注解是一个好主意,这样编译器就会向你显示错误。
因此,如果您想正确地覆盖方法
setValueAt
,只需将第一个参数的类型更改为Object
。但是,方法
setValueAt
用于更改JTable
中单元格的值,而不是用于添加行。参数student
的值将不是类Student
的示例。我建议您查看类DefaultTableModel的方法
addRow
的代码。如果您还没有这样做,我推荐Oracle的 Swing 教程,特别是How to Use Tables。
rt4zxlrg2#
当我添加一个新学生时,模型仍然会获得所有数据,但是JTable不会显示新添加的学生。
不要在模型外更新ArrayList的状态。应用程序不应该知道或关心数据是如何存储在模型中的。
所有的
fireXXX
方法只能从TableModel类中调用。模型的工作是通知视图模型的更改。查看; Row Table Model,了解如何将Student添加到模型中的实现。
基本逻辑是:
单击按钮时,可以使用
RowSorter
对数据进行排序。有关ActionListener代码的基本示例,请参见:https://stackoverflow.com/a/4831254/131872。