gpt4 book ai didi

java - 如何用不断变化的tableModel来刷新JTable?

转载 作者:行者123 更新时间:2023-12-01 11:35:29 26 4
gpt4 key购买 nike

2015.5.5 22:11 updated. I found that, when I create a sorter and call setRowSorter() method in the MyTable's construction, afterwards, it will keep the original line number(in which the data still refresh correctly but not easy to discover)even though the dataModel inside is already changed many times which can be proven as printf(getModel().getRowCount()). What's more, MyTable.getAutoCreateRowSorter() always return true. I must explicitly call setAutoCreateRowSorter(true) to fix the issue it if I called setRowSorter(). I am happy but this is still wierd.

<小时/>

[2015.5.5 6:19 updated] I have found a way to access: make a "setRow" with the combination of insertRow() and removeRow() and everytime I update, I setrRow all the rows in the table. It reflect immediately in the UI. BUT there will be a series of error begin with "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index" and I guess it's about some kiind of swing thread problem because I can see "RepaintManager" or "paint" in the error. It occurs especially when I move the scrollbar when it's running.(but it still occur if I don't move it)

我在 JFrame 的 JScrollPane 中有一个 JTable。我用数据初始化 MyTableModel 并用它来创建 JTable。像这样

MyTableModel extends DefaultTableModel{
Data data;
//object

MyTableModel (Data a){
data = a;
// do something to initial the table model,like build object[][] and add rows.
}
}
class main{
MyTableModel tm = new MyTableModel(data);
Jtable table = new JTable(tm);
JScrollpane jsp = new JScrollpane(table);
JFrame window = new JFrame();
window.getxxxpane().add(jsp);



}

因此,由于我的数据总是在更改/更新,并且更改的行是复数且无法计算。

while(true){
data.change();

refreshing the table to display the data immediately;

}

我的想法是简单地构建一个新的 MyTableModel 对象并将其设置为表的模型,如下所示:

 table.setModel(new MyTableModel(data));   //data had been changed.

这不起作用。我尝试了这个:

  tm = MyTableModel(data);
tm.fireTableDataChanged();

这也不起作用。以及组合:

  MyTableModol nm = new MyTableModel(data); //data had been changed
table.setModel(nm);
nm.fireTableDataChanged();

有人可以给我一些线索来更改不可更改的 Jtable 中的 TableModel 对象并每次更新。我不想更改 tableModel 对象,因为计算量很大,相反,我想始终通过构造创建一个新对象方法的参数(更改的数据)。

最糟糕的方法是删除 JScrollpane 并重建一个 table/tablemodel/jscrollpane 并重新添加它,其中我必须调用 window.setVisible(true)。 window.repait() 也不起作用,除非我移动它。我创建了一个浪费空间但可以运行的程序来演示,其中大部分都是废话。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Formatter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

class TM extends DefaultTableModel {
int[] inside;
static String[] columnNames = { "Hellium", "Radon",

};

TM(int[] data) {
super(columnNames, 0);
this.inside = data;
update();
}

void update() {
Object[][] data = new Object[2][columnNames.length];

for (int i = 0; i < 2; ++i) {

data[i][0] = inside[0];

data[i][1] = inside[1];
// setValueAt(aValue, row, column);
addRow(data[i]);

}
fireTableDataChanged();
}

}

class idkName {
TM tm;
JButton jb, jb2;
int data[] = { 1, 2 };
int data2[] = { 9, 10 };
JTable table;
JScrollPane jsp;
JFrame twindow;

idkName() {
JFrame window = new JFrame();
window.setSize(400, 400);
window.setLayout(new BorderLayout());
jb = new JButton("show");
jb2 = new JButton("change model");
window.add(jb, BorderLayout.EAST);
window.add(jb2, BorderLayout.WEST);
twindow = new JFrame();

jb.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
tm = new TM(data);
table = new JTable(tm);
jsp = new JScrollPane(table);
twindow.getContentPane().add(jsp);
twindow.setSize(500, 500);
twindow.setVisible(true);

}
});
window.setVisible(true);

jb2.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// tm = new TM(data2);

tm = new TM(data2);

System.out.println(""+tm.getValueAt(0,0));
tm.fireTableDataChanged();
twindow.setVisible(true);

}
});

}
}
public class main2 {
TM tm;
public static void main(String[] args) {
idkName i = new idkName();
}

}

最佳答案

如果您要扩展 DefaultTableModel,那么当数据更改时,您需要使用 setValueAt 在 DefaultTableModel 的内部表示中更新它setDataVector 方法。如果您进行了大量更改(听起来像您所做的那样),请使用 setDataVector 方法立即更改所有单元格和表结构。您的示例代码看起来缺少一些更新,因为它没有将新值推送到 DefaultTableModel 的数据 vector 中。

但是由于您有很多更新,因此您最好避免使用 DefaultTableModel 并仅扩展 AbstractTableModel,使用您自己的自定义数据存储,并调用适当的每当数据发生变化时,都会调用 fireXxx() 方法。就数据转换和引发的事件数量而言,这可能会更加有效。

然后确保使用 SwingWorker 或其他线程支持在 AWT 事件线程上完成所有事件和值更改工作。

关于java - 如何用不断变化的tableModel来刷新JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034360/

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