1

Jtableでレコードを表示するためにDefaultTableモデルを使用していますが、写真のような問題があります。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 画面 http://img244.yukle.tc/images/6092jtable_scr.jpg

4

7 に答える 7

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

(もちろん、上記のコードをコンパイルまたはテストしていません)

于 2009-07-01T10:24:22.727 に答える
2

投稿されたコードから、データレイアウトが何であるかを100%確信していません。しかし、私はあなたの問題がどこにあるかをあなたに言うことができます。

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

これは、Object[][]オブジェクトの2次元配列を作成しています。というか、x n x 1x2配列です

mx2配列を探している場合は、(これが目的の配列ではありません。例として[さらに、personelがスコープ内にないなど]):

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

[ [Ljava.lang.Object ...テキストは、Object []に対するtoString()の結果です。これが、マトリックスの次元が間違っていることを教えてくれます。

于 2009-07-01T10:21:33.093 に答える
1

マークの答えに続いて:

javax.swing.table.TableCellRenderer別のオプションは、いずれかの呼び出しでを割り当てることです

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

また

javax.swing.table.TableColumn.setRenderer(TableCellRenderer)
于 2009-07-01T10:25:19.887 に答える
1

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

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

于 2009-07-01T10:14:52.293 に答える
1

DefaultTableModel代わりに sub-classを使用しないことをお勧めしAbstractTableModelます。そうすれば、マークが提案するオブジェクトのtoString()メソッドをオーバーライドするアプローチに従うか、オーバーライドgetColumnClass(int column)して返されるオブジェクトのクラスを返し、 を呼び出してクラスに特定のレンダラーを提供JTableできますsetDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)

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

于 2009-07-01T10:31:48.750 に答える
0

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

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

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

于 2009-07-01T18:34:09.703 に答える
0

(m, n) のデータ位置に 2 次元オブジェクト配列を配置しているため、この動作が発生しています。

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

この場所に 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);
于 2009-07-03T12:08:56.813 に答える