【问题标题】:AbstractTableModel contains proper data but will not update on fireTablDataChangedAbstractTableModel 包含正确的数据,但不会在 fireTablDataChanged 上更新
【发布时间】:2014-11-02 09:24:27
【问题描述】:

我已经多次搜索并看到这个问题,但没有一个解决方案有效。

我有一个AbstractTableModel,我已经扩展并称为AccountTableModel。代码是这样的。

import InvAcntItem.Account;
import java.util.LinkedList;
import javax.swing.table.AbstractTableModel;

public class AccountTableModel extends AbstractTableModel 
{
    LinkedList<Account> dataList;
    private String[] columnNames = {"Username", "Password"};

    public AccountTableModel()
    {
        dataList = new LinkedList<>();
    }

    public void setNewAccounts(LinkedList<Account> inAccs)
    {
        System.out.println("Syncing local account");
        LinkedList<Account> newList = new LinkedList<>();
        for(int i = 0; i < inAccs.size(); i++)
            newList.add(Account.getDeepCopy(inAccs.get(i)));
        System.out.println("done");
        this.dataList = newList;
        System.out.println("set");
        this.fireTableDataChanged();
        System.out.println("set");
    }

    @Override
    public int getRowCount() 
    {
        return dataList.size();
    }

    @Override
    public int getColumnCount() 
    {
        return columnNames.length;
    }

    @Override
    public Object getValueAt(int col, int row) 
    {
        System.out.println("GetValueAt!");
        Object retObj = null;
        Account rowAcc = dataList.get(row);
        switch(col)
        {
            case 0:
            {
                retObj = rowAcc.user;
            }
            break;
            case 1:
            {
                retObj = rowAcc.pass;
            }
            break;
        }
        return retObj;
    }
}

所有println 语句都已执行,但 UI 永远不会更新。我什至创建了一个按钮,单击该按钮会调用表格模型fireDataChanged 函数。

它还调用getValueAt 函数并返回良好的数据。

还有什么可以阻止表格重绘的吗?

【问题讨论】:

  • 可能你没有在 EDT 线程上这样做

标签: java swing jtable abstracttablemodel


【解决方案1】:

除其他外,您对getValueAt() 的实现将行和列互换。解决这个问题并添加假的Account 数据似乎有效。

import java.awt.EventQueue;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

/**
 * @see http://stackoverflow.com/a/25736893/230513
 */
public class Test {

    private static class Account {

        public Account() {
        }
    }

    class AccountTableModel extends AbstractTableModel {

        LinkedList<Account> dataList = new LinkedList<>();
        private String[] columnNames = {"Username", "Password"};

        public void setNewAccounts(LinkedList<Account> inAccs) {
            dataList.clear();
            dataList.addAll(inAccs);
            this.fireTableDataChanged();
        }

        @Override
        public int getRowCount() {
            return dataList.size();
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public Object getValueAt(int row, int col) {
            Account account = dataList.get(row);
            if (col == 0) {
                return account.getClass();
            }
            if (col == 1) {
                return account.hashCode();
            }
            return null;
        }
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        AccountTableModel model = new AccountTableModel();
        LinkedList<Account> list = new LinkedList<>();
        list.add(new Account());
        list.add(new Account());
        list.add(new Account());
        model.setNewAccounts(list);
        f.add(new JScrollPane(new JTable(model)));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Test().display();
        });
    }
}

【讨论】:

  • 还要重新考虑在TableModel 中使用LinkedList;每个get() 最多可以遍历列表的一半。
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多