1

我正在使用 DefaultTable 模型在 Jtable 中显示我的记录。但是在图片中存在一个问题。当我加载 jtable 时,它​​的显示类似于 LJava.lang.Object 类型。不在字符串中..我该如何解决这个问题。这是我的代码;

EntityManagerFactory emf = Persistence.createEntityManagerFactory("SwingDenemePU");
EntityManager em = emf.createEntityManager();
Query sorgu = em.createQuery("select p from Personel p where p.personelAdSoyad like :ad");
Object[] kolonAdi = {"AD SOYAD","ÜNVAN ADI"};

sorgu.setParameter("ad", jTextField1.getText()+"%");
personelList = sorgu.getResultList();

Object[][] data = new Object[personelList.size()][kolonAdi.length];

for(int m=0; m<personelList.size(); m++)
    for(int n=0; n<kolonAdi.length; n++)
        for(Personel o : personelList) {
            Personel personel = (Personel)o;

            data[m][n] = new Object[][]{
                 {
                  personel.getPersonelAdSoyad(), 
                  personel.getUnvanID().getUnvanAdi()
                 }
            };
         }

 DefaultTableModel def = new DefaultTableModel();  
 def.setDataVector(data, kolonAdi);
 jTable1.setModel(def);

Jtable 屏幕 http://img244.yukle.tc/images/6092jtable_scr.jpg

4

7 回答 7

3

它输出 [[Ljava/lang/Object@.... 的原因仅仅是因为您分配给字段的值似乎是“Object [] []”类型

你确定这是你想要的吗?

data[m][n] = new Object[][] {}?

我没有付出太多努力,但我的直觉告诉我你真正想做的是:

for(int m=0; m<personelList.size(); m++) {
    Personel personel = personelList.get(m);
    data[m] = new Object[]{
              personel.getPersonelAdSoyad(),
              personel.getUnvanID().getUnvanAdi()
    };
}

(我当然没有编译或测试过上面的代码)

于 2009-07-01T10:24:22.727 回答
2

我不能 100% 确定您发布的代码中的数据布局是什么。但是,我可以告诉你你的问题在哪里。

data[m][n] = new Object[][]{{personel.getPersonelAdSoyad(),personel.getUnvanID().getUnvanAdi()}}

这是创建一个 Object[][] 对象的二维数组。或者更确切地说,am x n x 1 x 2 数组。

如果您正在寻找一个 mx2 数组,您会这样做(这并不是您想要的,只是举例[加上人员不在范围内,等等]):

data[m] = new Object[]{personel.getPersonelAdSoyad(),personel.getUnvanID().getUnvanAdi()};

[ [Ljava.lang.Object...文本是 Object[] 上 toString() 的结果。这就是告诉我你的矩阵尺寸是错误的。

于 2009-07-01T10:21:33.093 回答
1

DefaultTableModel 将所有值显示为字符串。您看到的是表中显示的值的默认 Object.toString() 实现的结果。

最简单的解决方案是覆盖 toString() 以为您在表中显示的对象返回一个合理的值。但是,您可能会更好地实现更适合您显示的数据的自己的表模型。有关表格模型的更多信息,请参阅 Swing 教程如何使用表格

于 2009-07-01T10:14:52.293 回答
1

继马克的回答之后:

另一种选择是分配javax.swing.table.TableCellRenderer一个调用

javax.swing.table.JTable.setDefaultRenderer(Class, TableCellRenderer)

或者

javax.swing.table.TableColumn.setRenderer(TableCellRenderer)
于 2009-07-01T10:25:19.887 回答
1

我建议不要使用DefaultTableModel而是使用 sub-class AbstractTableModel。这样,您仍然可以遵循 Mark 建议的方法来覆盖对象的toString()方法,或者您可以覆盖以返回要返回的对象的类,然后通过调用'sgetColumnClass(int column)为该类提供特定的渲染器。JTablesetDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)

我从不使用的主要原因DefaultTableModel是因为这意味着您的数据有效地存储在两个地方。相反,如果您是子类,则AbstractTableModel可以将其实现为底层数据结构的视图(例如,视图上的视图List<MyRecord>)。

于 2009-07-01T10:31:48.750 回答
0

好吧,看起来您正在从 ResultSet 中获取数据。根据您的实际要求,您有几个不同的选择。

如果您真的不需要创建“人员”对象来保存数据,那么您可以使用通用模型,您可以在“数据库表”条目中找到该模型。

如果您确实需要“人员”对象,那么您确实需要创建自定义模型。但是,这也可以通过使用“Bean Table Model”以通用方式完成。您可以通过从上述链接中搜索博客来找到此模型。

于 2009-07-01T18:34:09.703 回答
0

您之所以会出现这种行为,是因为您将一个二维对象数组放入您的数据位置 (m, n)

data[m][n] = new Object[][]{
    {
        personel.getPersonelAdSoyad(), 
        personel.getUnvanID().getUnvanAdi()
    }
};

如果你想在这个位置有一个二维数组,为了得到你想要的行为,你需要定义一个自定义渲染器。首先,我建议您将此原始二维数组封装到您设计的包含它的类中,然后为该类定义一个渲染器。

import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class CustomTableCellRenderer implements TableCellRenderer {

    private static final TableCellRenderer defaultRenderer = new DefaultTableCellRenderer();
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
        Component renderedObject = null;

        if(value instanceof CustomClass){
            renderedObject = new JLabel();
            // put your customized rendering code here.
        } else {
            renderedObject = defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
    return renderedObject;
    }

}

定义渲染器后,您可以在表格上设置它:

jTable1.setDefaultRenderer(CustomClass.class, customRenderer);
于 2009-07-03T12:08:56.813 回答