【问题标题】:Problem with Showing Records in Jtable在 Jtable 中显示记录的问题
【发布时间】:2009-07-01 09:59:51
【问题描述】:

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

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 谢谢你的解决方案和 Fredrik 的一样。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        接着马克的回答:

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

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

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

        【讨论】:

          【解决方案5】:

          我建议不要使用DefaultTableModel,而是使用子类AbstractTableModel。这样,您仍然可以遵循 Mark 建议的方法来覆盖对象的 toString() 方法,或者您可以覆盖 getColumnClass(int column) 以返回要返回的对象的类,然后通过调用 JTable 为该类提供特定的渲染器。 ssetDefaultRenderer(Class&lt;?&gt; columnClass, TableCellRenderer renderer).

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

          【讨论】:

          • 同意 - DefaultTableModel 是邪恶的,你应该专门化 AbstractTableModel。
          【解决方案6】:

          你得到这个行为是因为你将一个二维对象数组放入你的数据位置 (m, n)

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

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2019-06-08
              • 2014-02-13
              • 1970-01-01
              • 1970-01-01
              • 2012-08-28
              • 1970-01-01
              • 1970-01-01
              • 2013-01-19
              • 2019-03-16
              相关资源
              最近更新 更多