java 当我更改数组列表数据时,JTable不显示数据[已关闭]

kkbh8khc  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(120)

已关闭。此问题需要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);
    }
}
uqjltbpv

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

rt4zxlrg

rt4zxlrg2#

当我添加一个新学生时,模型仍然会获得所有数据,但是JTable不会显示新添加的学生。
不要在模型外更新ArrayList的状态。应用程序不应该知道或关心数据是如何存储在模型中的。
所有的fireXXX方法只能从TableModel类中调用。模型的工作是通知视图模型的更改。
查看; Row Table Model,了解如何将Student添加到模型中的实现。
基本逻辑是:

public void insertStudent(int row, Student student)
{
    students.add(row, student); // I think "students" is more descriptive than "data"
    fireTableRowsInserted(row, row);
}

单击按钮时,可以使用RowSorter对数据进行排序。
有关ActionListener代码的基本示例,请参见:https://stackoverflow.com/a/4831254/131872

相关问题