Java 删除行后未重新绘制JTable

Java 删除行后未重新绘制JTable,java,swing,jtable,Java,Swing,Jtable,AdminFrame.java package com.sorcerok; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax

AdminFrame.java

package com.sorcerok;

import java.awt.Color;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;

public class AdminFrame extends JFrame {

    private JFrame frame;
    private JPanel panel;
    private JButton delete, change;
    private JTable usersTable;
    private static final int WIDTH = 510;
    private static final int HEIGHT = 300;
    private List<User> list;
    private MyTableModel model;

    public AdminFrame(JFrame frame) {
        super("Просмотр пользователей");
        setResizable(false);
        this.frame = frame;
        frame.setVisible(false);


        panel = new JPanel();
        frame.setResizable(false);
        panel.setLayout(null);

        delete = new JButton("Удалить");
        delete.setBounds(310, 230, 121, 30);
        change = new JButton("Изменить");
        change.setBounds(50, 230, 121, 30);


        list = new ArrayList<>(Authorisation.userMap.values());

        model = new MyTableModel(list);

        usersTable = new JTable(model);
        JTableHeader header = usersTable.getTableHeader();
        header.setForeground(Color.black);
        header.setFont(new Font("Times New Roman", Font.BOLD, 20));
        JScrollPane sp = new JScrollPane(usersTable);

        sp.setBounds(0, 0, 500, 90);

        panel.add(delete);
        panel.add(change);
        panel.add(sp);

        add(panel);
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public void dispose() {
        frame.setVisible(true);
        super.dispose();
    }

    public void deleteFromTable() {

        delete.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int row = usersTable.getSelectedRow();
                if (getSelectedUser(row) != null) {
                    Authorisation.userMap.remove(getSelectedUser(row).getName());
                    list.remove(getSelectedUser(row));
                    System.out.println(list);
                    Registration.writeToFile();

                    model.removeRow(row);
                }
            }
        });

    }

    public User getSelectedUser(int index) {
        index = usersTable.getSelectedRow();
        if (isSelectedUser(index)) {
            String name = (String) usersTable.getValueAt(index, 1);
            return getUser(name);
        } else {
            return null;
        }
    }

    public boolean isSelectedUser(int index) {
        if (index < 0) {
            return false;
        } else {
            return true;
        }
    }

    public User getUser(String name) {
        for (User u : list) {
            if (name.equals(u.getName())) {
                return u;
            }
        }
        return null;
    }

    public class MyTableModel extends AbstractTableModel {

        private List<User> list;

        private MyTableModel(List<User> list) {
            this.list = list;
        }

        public void addTableModelListener(TableModelListener listener) {
        }

        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        public int getColumnCount() {
            return 3;
        }

        public String getColumnName(int columnIndex) {

            switch (columnIndex) {
                case 0:
                    return "№";
                case 1:
                    return "Логин";
                case 2:
                    return "Пароль";
            }
            return "";
        }

        public int getRowCount() {
            return list.size();
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            User user = list.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return ++rowIndex;
                case 1:
                    return user.getName();
                case 2:
                    return user.getPassword();

            }
            return "";
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }

        public void removeTableModelListener(TableModelListener listener) {
        }

        public void setValueAt(Object value, int rowIndex, int columnIndex) {
        }

        public void removeRow(int row) {

            fireTableRowsDeleted(row, row);
            fireTableStructureChanged();
            System.out.println("Deleted by AbstractTableModel Table Model");

        }
    }
}

当表格中有很多元素且存在滚动时,即按删除一行,该行立即从Arralist中删除,但未从表格中删除,如果使用滚动,记录立即消失。没有此方法模型的相同函数。removeRow(行);什么是wrang?

您的表模型不支持
TableModelListeners
,这就是为什么表无法观察模型上的更改

您的TableModel应该在更改时通知
TableModelListeners
(当添加、删除或刷新行时)
在表格上设置模型时,表格将向模型添加一个
TableModelListener
。一旦模型更改,它将触发一个
TableModelEvent
(通过在所有侦听器上调用
tableChanged(TableModelEvent)
)。然后,
JTable
将收到此通知,重新验证并重新绘制表格内容以适应更改

在您的具体案例中:
您已经重写了
添加| removeTableModelListener()
方法,因此无法注册任何侦听器。只需删除模型上的这两个方法,并让
DefaultTableModel
对这些方法的实现来处理它。

无关:不要对组件进行任何手动大小调整/定位,这是合适的LayoutManagerFirst的独有任务,我想修复delete函数,非常感谢您在我使用DefaultTableModel并从DefaultTableModel调用removeRow方法时它的工作
AdminFrame af = new AdminFrame(frame);
af.deleteFromTable();