我正在使用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
答案 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);