2009-07-01 12 views
1

Jtable.Butでレコードを表示するためにDefaultTable Modelを使用していますが、画像に問題があります.jtableをLJava.lang.Object型のように表示しています。文字列ではありません。どうすればこの問題を解決できますか? ここに私のコードです。Jtableでレコードを表示する際の問題

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

答えて

3

それは[[Ljava/LANG /オブジェクト@を出力理由は....単にあなたが欲しいものは何ですか?

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

コード)

+0

高齢者。あなたは私の問題を解決しました –

1

DefaultTableModelを文字列としてすべての値を表示します。あなたが見ているのは、テーブルに表示されている値のデフォルトのObject.toString()実装の結果です。

最も簡単な解決策は、テーブルに表示されているオブジェクトの分かりやすい値を返すためにtoString()をオーバーライドすることです。ただし、表示しているデータに適した独自のテーブルモデルを実装する方がよい場合があります。テーブルモデルの詳細については、SwingチュートリアルHow To Use Tablesを参照してください。

2

投稿されたコードのデータレイアウトが100%確実であるとは限りません。しかし、私はあなたの問題がどこにあるかを伝えることができます。

​​3210

これは、オブジェクト[] []オブジェクトの2次元配列を作成しています。またはむしろ、m x n x x 2配列です。

mx2アレイを探しているなら、これはあなたのためのものではなく、例として[プラスpersonelは範囲外であるなど]:

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

[Ljava.lang.Object ...テキスト、オブジェクト[]上のtoString()の結果です。あなたのマトリックスの寸法が間違っていると私には分かります。あなたがフィールドに割り当てる値のタイプであると思われる「オブジェクトは、[] []」

は、あなたがこのことを確認されているので

+0

フレドリックのと同じです。 –

1

マークの答えに続き:

別のオプションは、

のいずれかを呼び出して javax.swing.table.TableCellRendererを割り当てることです210
javax.swing.table.JTable.setDefaultRenderer(Class, TableCellRenderer) 

または

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

私はDefaultTableModelではなく、サブクラスAbstractTableModelを使用しないことをお勧めします。そうすればあなたはまだ、オブジェクトのtoString()メソッドをオーバーライドするマークによって提案されたアプローチに従うこともできますし、返されるオブジェクトのクラスを返すようにgetColumnClass(int column)を無効にしてからJTablesetDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)を呼び出すことにより、クラスの特定のレンダラを提供することができます。

私が決して使用しない主な理由DefaultTableModelは、データが効果的に2つの場所に格納されていることを意味するためです。対照的に、サブクラスAbstractTableModelの場合は、それを基になるデータ構造のビューとして実装することができます(たとえば、List<MyRecord>のビュー)。

+1

これは合意に達しました - DefaultTableModelは悪く、AbstractTableModelを専門にする必要があります。 –

0

これは、ResultSetからデータを取得しているようです。実際の要件に応じて、いくつかのオプションがあります。

実際にデータを保持するために "Personel"オブジェクトを作成する必要がない場合は、Table From Databaseエントリにある汎用モデルを使用できます。

"Personel"オブジェクトが必要な場合は、カスタムモデルを作成する必要があります。ただし、これは一般的な方法で「Bean Table Model」を使用して行うこともできます。上記のリンクからブログを検索することで、このモデルを見つけることができます。

0

あなたは(m、n)が

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

であなたのデータの場所に2次元のオブジェクトの配列を配置しているので、あなたがこの場所に2次元配列を持たせたい場合は、この動作を得ている、 へあなたが望む振る舞いを得るには、カスタムrendererを定義する必要があります。最初に、この生の2次元配列を、それを含むように設計したクラスにカプセル化し、そのクラスのレンダラーを定義することをお勧めします。あなたのレンダラを定義した後

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); 
関連する問題