gpt4 book ai didi

java - AbstractTableModel 包含正确的数据,但不会在 fireTableDataChanged 上更新

转载 作者:行者123 更新时间:2023-11-29 05:18:18 24 4
gpt4 key购买 nike

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

我有一个 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 函数并返回正确的数据。

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

最佳答案

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

image

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();
});
}
}

关于java - AbstractTableModel 包含正确的数据,但不会在 fireTableDataChanged 上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com