Java 从向量动态更新JTable<;向量<;字符串>&燃气轮机;

Java 从向量动态更新JTable<;向量<;字符串>&燃气轮机;,java,swing,vector,Java,Swing,Vector,我有一个名为FetchInbox()的函数,它获取电子邮件的标题信息(发件人、主题、发送日期),然后将其添加到字符串向量向量中 我想能够做的是在新电子邮件到来时刷新此表,并通过再次运行FetchInbox()更新表,然后使用它重新填充表 我知道这可以通过使用TableModel实现,但我还没有找到一个使用向量而不是对象[]的示例。如果您有任何帮助,我们将不胜感激。请看一看,这将为您节省大量时间。 使用它,您可以动态地将JTable绑定到对象列表,这样对象中的任何更改都会反映在表中,反之亦然。De

我有一个名为FetchInbox()的函数,它获取电子邮件的标题信息(发件人、主题、发送日期),然后将其添加到字符串向量向量中

我想能够做的是在新电子邮件到来时刷新此表,并通过再次运行FetchInbox()更新表,然后使用它重新填充表

我知道这可以通过使用TableModel实现,但我还没有找到一个使用向量而不是对象[]的示例。如果您有任何帮助,我们将不胜感激。

请看一看,这将为您节省大量时间。
使用它,您可以动态地将JTable绑定到对象列表,这样对象中的任何更改都会反映在表中,反之亦然。

DefaultTableModel具有采用向量而不是对象[]的构造函数和方法

DefaultTableModel的旧版本只使用向量,Object[]参数是在泛型进入Java时添加的新方法


这应该行得通,但@jzd的答案可能正是您想要的,但需要注意的是,根据文档,如果列
向量
的长度与表中所需的列数不匹配,则可能会对其进行截断或填充

import javax.swing.*;
import javax.swing.table.*;
import java.util.*;

class test{
  public static void main(String[] _) {

    // Test data.
    final Vector<Vector<String>> rows = new Vector<Vector<String>>();
    for (int i = 0; i < 4; i++) {
      Vector<String> row = new Vector<String>();
      for (int j = 0; j < 5; j++) {
        row.add(String.format("%s, %s", i, j));
      }
      rows.add(row);
    }

    // With AbstractTableModel, you only need to implement three methods.
    TableModel model = new AbstractTableModel() {
      public int getRowCount() {
        return rows.size();
      }
      public int getColumnCount() {
        return rows.elementAt(0).size();
      }
      public Object getValueAt(int row, int column) {
        return rows.elementAt(row).elementAt(column);
      }
    };

    // Test the TableModel in a JTable.
    JFrame jf = new JFrame("test");
    jf.setSize(512, 384);
    jf.setContentPane(new JScrollPane(new JTable(model)));
    jf.show();

  }
}
import javax.swing.*;
导入javax.swing.table.*;
导入java.util.*;
课堂测试{
公共静态void main(字符串[]){
//测试数据。
最终向量行=新向量();
对于(int i=0;i<4;i++){
向量行=新向量();
对于(int j=0;j<5;j++){
添加(字符串格式(“%s,%s”,i,j));
}
行。添加(行);
}
//使用AbstractTableModel,您只需要实现三种方法。
TableModel模型=新的AbstractTableModel(){
public int getRowCount(){
返回rows.size();
}
public int getColumnCount(){
返回rows.elementAt(0.size();
}
公共对象getValueAt(int行,int列){
返回行.elementAt(行).elementAt(列);
}
};
//在JTable中测试TableModel。
JFrame jf=新JFrame(“测试”);
jf.设置大小(512384);
setContentPane(新的JScrollPane(新的JTable(模型));
jf.show();
}
}

当您创建一个表而不向其提供
模型时,它将使用
DefaultTableModel
作为默认模型。该模型有两个功能:

 DefaultTableModel model = (DefaultTableModel) table.getModel();
 model.setDataVector(dataVector, comlnIdentifiers);
  • setDataVector(Vector dataVector,Vector columnIdentifiers)
    :其中
    dataVector
    Vector
    向量(表示表中的数据行),comlumnIdentifiers是包含标识符的
    Vector
    。当您提供向量时,它将显示您的表

  • addRow(Vector dataRow)
    :它将向您的
    dataVector
    添加一个数据行,如上所述

  • 因此,获取模型并调用以下函数非常简单:

     DefaultTableModel model = (DefaultTableModel) table.getModel();
     model.setDataVector(dataVector, comlnIdentifiers);
    
    在您的上下文中,
    dataVector
    的类型为
    vector
    。但是依赖向量并不是一个好的选择。如果您直接使用
    对象[]
    ,则会更加安全有效。
    DefaultTableModel
    也具有与对象数组类似的功能

  • setDataVector(对象[][]数据向量,对象[]列标识符)
  • addRow(对象[]行数据)

  • 查看教程页面:了解更多关于表及其模型的操作。

    我现在遇到的问题是,在使用DefaultTableModel实现它之后,当我调用fireTableDataChanged()时,表不会反映向量向量的变化。这是一个图形化的东西还是我调用了错误的方法?