在Jtable中显示记录的问题

时间:2009-07-01 09:59:52

标签: java swing jtable

我正在使用DefaultTable Model在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 Screen http://img244.yukle.tc/images/6092jtable_scr.jpg

7 个答案:

答案 0 :(得分: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()
    };
}

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

答案 1 :(得分:2)

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

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

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

如果你正在寻找一个你需要的mx2阵列(不是这就是你想要的,只是作为例子[加上人员不在范围内等等]):

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

接下来马克回答:

另一种选择是指定一个javax.swing.table.TableCellRenderer来调用

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

javax.swing.table.TableColumn.setRenderer(TableCellRenderer)

答案 4 :(得分:1)

我建议不要使用DefaultTableModel,而是使用子类AbstractTableModel。这样你仍然可以遵循Mark建议覆盖对象的toString()方法的方法,或者你可以覆盖getColumnClass(int column)来返回被返回对象的类,然后通过调用为类提供特定的渲染器JTable的{​​{1}}。

我从不使用setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)的主要原因是因为它意味着您的数据有效地存储在两个地方。相反,如果您对子类DefaultTableModel进行子类化,则可以将其实现为基础数据结构的视图(例如,AbstractTableModel上的视图)。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

您收到此行为是因为您将二维对象数组放入数据位置(m,n)

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

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

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);