Java 在Jtable中显示记录时出现问题

Java 在Jtable中显示记录时出现问题,java,swing,jtable,Java,Swing,Jtable,我使用DefaultTable模型在Jtable中显示我的记录。但是有一个问题,如图所示。当我加载Jtable时,它的显示方式类似于LJava.lang.Object类型。不在字符串中..我如何解决这个问题。 这是我的密码 EntityManagerFactory emf = Persistence.createEntityManagerFactory("SwingDenemePU"); EntityManager em = emf.createEntityManager(); Query so

我使用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);
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“SwingDenemePU”);
EntityManager em=emf.createEntityManager();
Query sorgu=em.createQuery(“从Personel p中选择p,其中p.personelAdSoyad类似于:ad”);
对象[]kolonAdi={“AD SOYAD”,“ÜNVAN ADI”};
sorgu.setParameter(“ad”,jTextField1.getText()+“%”);
personelList=sorgu.getResultList();
Object[][]数据=新对象[personelList.size()][kolonAdi.length];

对于(int m=0;m,DefaultTableModel将所有值显示为字符串。您看到的是表中显示的值的默认Object.toString()实现的结果


最简单的解决方案是重写toString()为表中显示的对象返回合理的值。但是,您最好实现自己的表模型,该模型更适合您正在显示的数据。有关表模型的详细信息,请参阅Swing教程。

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


最简单的解决方案是重写toString()为表中显示的对象返回一个合理的值。但是,您最好实现自己的表模型,该模型更适合显示的数据。有关表模型的详细信息,请参阅Swing教程。

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

data[m][n] = new Object[][]{{personel.getPersonelAdSoyad(),personel.getUnvanID().getUnvanAdi()}}
这是在创建一个二维数组,其中包含对象[][]对象。或者更确切地说,是一个mxnx1x2数组

如果您正在寻找mx2阵列,您会这样做(这不是您想要的,只是举个例子[加上personel不在范围内,等等]):


[[Ljava.lang.Object…”文本是对象[]上toString()的结果。这告诉我您的矩阵维度是错误的。

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

data[m][n] = new Object[][]{{personel.getPersonelAdSoyad(),personel.getUnvanID().getUnvanAdi()}}
这是在创建一个二维数组,其中包含对象[][]对象。或者更确切地说,是一个mxnx1x2数组

如果您正在寻找mx2阵列,您会这样做(这不是您想要的,只是举个例子[加上personel不在范围内,等等]):


[[Ljava.lang.Object…”文本是对象[]上的toString()的结果。这就是告诉我矩阵维数错误的原因。

它输出[[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()
    };
}

for(int m=0;m它输出[[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()
    };
}

for(int m=0;m根据Mark的回答:

另一个选项是分配一个
javax.swing.table.TableCellRenderer
,并调用

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


下面是马克的回答:

另一个选项是分配一个
javax.swing.table.TableCellRenderer
,并调用

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


我建议不要使用
DefaultTableModel
,而是使用sub-class
AbstractTableModel
。这样,您仍然可以按照Mark建议的方法覆盖对象的
toString()
方法,或者可以覆盖
getColumnClass(int-column)
返回所返回对象的类,然后通过调用
JTable
setDefaultRenderer(class columnClass,TableCellRenderer renderer renderer)
为该类提供特定的呈现器


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

我建议不要使用
DefaultTableModel
,而是使用子类
AbstractTableModel
。这样,您仍然可以按照Mark建议的方法重写对象的
toString()
方法,或者可以重写
getColumnClass(int column)
返回所返回对象的类,然后通过调用
JTable
setDefaultRenderer(class columnClass,TableCellRenderer renderer renderer)
为该类提供特定的呈现器


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

如果您真的不需要创建一个“Personel”对象来保存数据,那么您可以使用一个通用模型,您可以在条目中找到它


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

好吧,看起来您是g
jTable1.setDefaultRenderer(CustomClass.class, customRenderer);