1

JTableデータの更新に苦労しています。

私は、テーブルデータが読み取られる場所からを構築するためにそれを受け取り、処理するメソッドを使用して、TableModelから拡張する独自のを実装しています。javax.swing.table.AbstractTableModeljava.util.ArrayList<>Object[][]

ロジックは次のとおりです。

いくつかのレコードキーを使用してJListを実装しています。ユーザーがレコードキーを選択すると、キーを取得してMySQLデータベースにクエリを実行し、そのキーに関連するレコードをフェッチするメソッドが起動されます。最終結果は、データを構築するためにTableModelに渡したArrayList <>であり、それをテーブルに設定します。

正常に動作しますが、数回ヒットするとテーブルデータの表示が停止し、しばらくすると再び動作を開始します。テーブルまたはGUI全体の更新に問題があるかどうかはわかりません。

これはコードの抜粋です:

テーブルのデータを作成する方法:

public void createTableData(java.util.ArrayList<Lote> alLote) {
    //Lote is an entity class modeling the database table.
    TABLE_DATA = new Object[alLote.size()][TABLE_COLUMNS.length];
    //TABLE_DATA is an Object array, TABLE_COLUMNS is a String[] containing the names of the columns.
    int i = 0;
    for (Lote element : alLote) {
        int j = 0;
        TABLE_DATA[i][j++] = element.getFirstColumnValue();
        //and so son
        i++;
    }
    super.fireTableDataChanged();
}

GUIを起動すると、空のArrayList<>で始まります。

LoteTableModel ltm = new LoteTableModel();
arrayList = new ArrayList<Lote>();
ltm.createTableData(arrayList);
myTable = new JTable();
myTable.setModel(ltm);
scrollPane = new JScrollPane(myTable);

私はDesignGridLayoutbtwを使用しています。これは、テーブルにレコードがない場合は非表示にし、結果がある場合は表示するRowGroupであり、テーブルコンテナーとしてJScrollPaneを使用しています。

dgl = new DesignGridLayout(panel);
dgl.row().center().group(group).add(scrollPaneContainingTable).fill();
centerPanel.add(panel, BorderLayout.CENTER);
getContentPane().add(centerPanel);
centerPanel.setVisible(true);

次に、ユーザーがJListからアイテムを選択するたびに、データベースにクエリを実行し、選択した値に関連するレコードをフェッチします。

public void listSelectionChanged() {
    bloque = alBloque.get(listBloque.getSelectedIndex());
    //bloque is another entity, alBloque is an ArrayList<Bloque> from which the JList (named listBloque) ListModel is constructed.
    try {
        //database query here, omitted
        if (result.getStatus() == SUCCESS) {
            //the query returned a populated ArrayList<Lote>
            alLote = result.getArray();
            ((LoteTableModel) myTable.getModel()).createTableData(alLote);
            myTable.revalidate();
        }
    } catch (Exception e) {}
}

前に述べたように、リストの値をクリックするとテーブルに関連するレコードが表示されますが、いくつかクリックするとデータの表示がまったく停止します。しばらくそのままにしてからもう一度値をクリックすると、正しいデータが再び表示されるので、前に言ったように、GUIの更新の問題のようなものかどうかはわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

私は問題を見つけました、そして私が思ったように、それはリフレッシュではなく、レイアウトパッケージの誤用のGUIの問題でした:)

私が使用しているようにDesignGridLayout、それは行のグループを作成し、それを呼び出しRowGroupて非表示にしたり、GUIの利便性/ニーズに応じて表示したりするという利点があります。

テーブルをに配置し、データベースに結果があったときにメソッドRowGroupを呼び出すshow()と、テーブルにこれらの結果が読み込まれ、表示されます。hide()結果が見つからなかったときにメソッドを呼び出したため、テーブルが空になるため、非表示にします。

重要なのは、メソッドの呼び出しhide()は累積的であるということです...メソッドを3回呼び出した場合、それを表示するにはshow()メソッドも3回呼び出す必要があるためJList、テーブルの結果セットが空の場合、hide()メソッドを3回呼び出すので、実際にテーブルの結果があった行を選択すると、show()メソッドを1回だけ呼び出すので、3回試行するまでテーブルが期待どおりに表示されません。テーブルの結果を含む行を選択します。

hide()残念ながら、パッケージには呼び出されたかどうかをテストDesignGridLayoutするメソッドが含まれていないため、アプリにメソッドを1回だけ呼び出すように強制するコントロールフィールドを配置しました。isHide()hide()

ご支援ありがとうございました。私の謎の質問はこれで解決されました。

于 2013-03-06T16:26:42.937 に答える