3

OK、このテーブルを JFrame に追加された JPanel に追加しました。

mousePressed イベントでは、新しいクラス tData を設定し、ベクター要素に含まれる文字列としてデータベースからデータを返すメソッドを呼び出します。

私がしたいことは、btnが押されるたびにテーブルを更新し、

btn が押されるたびにテーブルが更新されますが、同じデータがテーブルの最後に追加されます。

これが起こる原因は何ですか?

    Object columnHeaders[] = {"Fname", "Mname", "Lname", "Age"};
    Object data[][] = {{}};
    final DefaultTableModel dtm = new DefaultTableModel(data, columnHeaders);

    JTable tb = new JTable(dtm);
    JScrollPane scrollPane = new JScrollPane(tb);

    tableWrap.add(scrollPane);

    btn.addMouseListener(new MouseAdapter() {

        @Override 
        public void mousePressed(MouseEvent arg0) {
            tData h = new tData(10));
            Vector<String> v = h.getInfo();
            for(int i = 0; i < v.size() ; i++) {
                dtm.insertRow(i, new Object[]{v.get(i).split(",")[0], v.get(i).split(",")[1], v.get(i).split(",")[2], v.get(i).split(",")[3]});
            }

            dtm.fireTableDataChanged();
            frame.repaint();
        }
    });
4

2 に答える 2

4

ここにいくつかの問題があります:

  1. そのボタンが押されるたびに、テーブル全体を更新する必要があるようです。ここには 3 つのオプションがあります。 を使用して DefaultTableModel を更新するsetDataVector、新しいモデルをゼロから再作成して を使用して JTable に設定する、適切な TableModel イベントに基づいsetModelて独自に実装し、起動する。とを使用してモデルを更新することもできますが、多くのイベントがトリガーされるため、非常に効果的ではありません。TableModelAbstractTableModeladdRowremoveRow

  2. 「ボタンが押された」イベントをリッスンするには、ユーザーActionListener(および を使用して追加addActionListener) またはアクション (および で設定) を使用しsetActionます。

  3. DefaultTableModel では、構造を変更する場合、手動で呼び出す必要はありませんfireTableDataChanged();。基になるデータを変更するたびに、適切な TableModel イベントが自動的に発生します。どちらも呼び出さないでくださいframe.repaint()。無駄であり、時間がかかる可能性があります。

  4. 無関係: Java コーディング規約(クラス名は大文字で始まる) と意味のある変数名に従うことを検討してください。

于 2012-06-22T08:35:08.957 に答える
1

ここで書いたコードにはかなりの問題があります。まず、mousePressedメソッドのコードで発生している問題に対処しましょう。

データ提供コードからVectorを取得し、テーブルの行0...nに新しいデータを設定します。これを行う方法は、ボタンが押されたときに必要なデータを返すAbstractTableModelのカスタム拡張を作成することです。

もう1つの問題は、ボタンの押下を処理する方法です。ボタンにマウスリスナーを追加することは、それを処理する正しい方法ではありません。ボタンにActionListenerを追加します。そのリスナーは、ボタンが押されて離されるたびに起動されます。

于 2012-06-22T00:04:07.070 に答える