【问题标题】:Java JTable vector with objects filling带有对象填充的 Java JTable 矢量
【发布时间】:2012-10-31 11:02:28
【问题描述】:

我已经尝试填充 JTable 大约三天了。我需要做的就是用“Artikel”对象填充一个向量向量,填充一个标题向量并将这两个向量绑定到一个 JTable。

我可以使用自定义 AbstractTableModel 来管理它,但我无法创建 addColumn() 方法。所以,我放弃了这种方式。现在我只使用标准 DefaultTableModel 但现在我无法正确填充我的 JTable。我将所有对象都放在第一列中,而不是分开到所有列中: fault screenshot

我的 Artikel 课程:

public class Artikel {

private String EnitiativeRef;
private String Brand;
private String pnb;
.
.
.
public Artikel(){        
}

public String getEnitiativeRef() {
    return EnitiativeRef;
}

public void setEnitiativeRef(String EnitiativeRef) {
    this.EnitiativeRef = EnitiativeRef;
}
.
.
.
}

我的按钮代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    ICsvBeanReader inFile = null;
    String[] header = {};
    Vector<Vector<Artikel>> data = null;

    try {
        inFile = new CsvBeanReader(new FileReader("C:\\609661920071022111.csv"), CsvPreference.STANDARD_PREFERENCE);

        header = inFile.getHeader(true);

        data = new Vector<Vector<Artikel>>();

        Artikel artikel;
        while ((artikel = inFile.read(Artikel.class, header, cellProcessor)) != null) {
            Vector<Artikel> tmpVector = new Vector<Artikel>();
            tmpVector.addElement(artikel);
            data.addElement(tmpVector);
        }

    } catch (Exception ex) {
        System.out.println("FOUT: " + ex.toString());
    } finally {
        try {
            inFile.close();
        } catch (IOException ex) {
            Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    tblAll.setModel(new DefaultTableModel(data, new Vector(Arrays.asList(header))));
    tblAll.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}

你能告诉我我做错了什么或指导我做这件事的正确方法吗?非常感谢您的帮助。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE。 CSV 数据的硬编码值。
  • 注意:可能长时间运行的任务(文件 I/O、数据库访问..)应该在 EDT 上完成。 GUI 更新应在 EDT 上完成。该代码似乎将两者混合在一起。有关详细信息,请参阅Concurrency in Swing
  • @AndrewThompson:我不确定我是否同意你的最后评论。这表明没有足够的 toString() 覆盖,但不是数组。
  • 在我看来您没有正确填写 DefaultTableModel。您正在添加 Artikels,而您应该独立添加每列的每个值。无论如何,如果你扩展AbstractTableModel并依赖你Vector&lt;Artikel&gt;会容易得多
  • @AndrewThompson:您关于“Swing 中的并发”的建议是我的想法,但我不知道它是什么/如何,谢谢;)

标签: java swing vector jtable defaulttablemodel


【解决方案1】:

向量向量中的每个元素代表一行,这些元素向量的每个元素代表一列。

您正在向主向量添加单元素向量,并且该元素是您尚未为其实现 toString 方法的类的对象。

你可能走错路了。

【讨论】:

  • 谢谢大家的回复!现在我开始看到我做错了什么。我刚刚在“Artikel”类中实现了 toString 方法,如下所示:@Override public String toString(){return EnitiativeRef + " " + Brand + " " + pnb;} 结果仍然出现在第一列中,但这次每个对象的值都作为一个附加在一起行:screenshot。由于我的 toString 实现,我知道这种行为很正常。你能举个例子,使用 DefaultTableModel 独立添加每列的每个值吗?
  • 这个问题通过使用vector中的对象而不是vector中的向量来解决。因此,将 Vector&lt;Vector&lt;Artikel&gt;&gt; data 更改为 Vector&lt;Artikel&gt; data 。我现在也可以使用标准的自定义 AbstractTableModel 做任何我想做的事情。如果您想在 JTabel 中进行更改(更新记录,添加列..),诀窍是更新向量然后建模。谢谢大家的回复,让我想到了更新JTable的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多