2

Swing で MVC パターンを実装する方法を学び始めています。モデル内のデータに関しては混乱しています。

私がやっているアプリケーションには、いくつかの JTextFields があります。フィールドのデータ セットは JTable から取得されます。選択が変更されたときに、選択された行のデータがそれぞれのテキストフィールドに反映されるようListSelectionListenerに、コントローラーにそのjtable(ビュー内)に追加しました

    public void transferTableDataToFields(){
        if(tblProduct.getSelectedRows().length != 0){
            int selRow = tblProduct.getSelectedRow();
            txtID.setText(tblProduct.getValueAt(selRow, 0).toString());
            txtName.setText(tblProduct.getValueAt(selRow, 1).toString());
            txtDescIn.setText(tblProduct.getValueAt(selRow, 2).toString());
            txtSupplier.setText(tblProduct.getValueAt(selRow, 4).toString());
            txtPrice.setText(tblProduct.getValueAt(selRow, 5).toString());
        }
    }

私の質問は、私はそれを正しい方法で行っていますか? ビューのテキストフィールドに対応するモデルのフィールドを定義し、コードをコントローラーに変更してモデルのフィールドをビューのjtableの値に設定し、モデルがプロパティ変更通知をリスナーに送信するようにし、リスナーにプロパティの変更イベントに基づいてビューのメソッドを更新しますか?

このアプローチに関する私の問題は、ビューには、jtable から選択された行を返すメソッドが必要であり、少し見苦しいことです。

編集

@trashgodこれが私が言っていることです。

私の TableModel 実装内で、ここにデータを入力する方が良いですか?

public MyTableModel extends AbstractTableModel{
   List<Row> data;
   Row header;

   public MyTableModel(){
      initializeData();
   }   

   public void initializeData{
      //query database here then put it in the list
   }
   //other methods to implement e.g. getvalueAt(int x, inty){data.get(x).get(y);}
}

こうやって作った方がいいの?現在、メインモデルにテーブルのデータを保存して入力しているため(ビューに対応するテキストフィールドを持つフィールドも含まれていSelectedRowます)、データを自分JTableのモデルに渡します。

4

1 に答える 1

2

この場合、現在の選択はビューのプロパティであり、のインスタンスでありJTable、モデルではなく、の実装ですTableModel

それ自体で編集を置き換えることを選択した場合、(匿名の) 従属ビューを更新する正しい方法は a です。コントローラーは、リスナーとして に追加する以外に、ほとんど何もする必要はありません。(おそらく) 編集可能なフィールドが含まれているため、いくつかの責任があります。JTableListSelectionListenerSelectedRowSelectedRowJTableSelectedRow

  • TableModel通常は を介し​​て、変更を元のテーブルの に反映しますsetValueAt()

  • ビュー座標とモデル座標の間の変換については、こちらを参照してください。

  • ListSelectionListenerソースでの編集を除外 (または 経由で同期) しますJTable

補遺:私の TableModel 実装では、ここにデータを入力する方が良いですか?

答えはアプリケーションによって異なります。実装TableModelでは、同時実行性と待機時間に関するアプリケーションの要件をサポートするために必要なだけ (またはほとんど) 提供するパブリック API を公開する必要があります。参考までに、これは一般的な例ですが、内部DefaultTableModelよりも新しいものを使用することをお勧めします。Vector

于 2013-04-07T20:34:04.497 に答える