0

JTable に表示する必要があるオブジェクト (ターミナル、滑走路、ゲート、航空会社、労働者など) がいくつかあります。すべてのコレクションで機能する GenericTableModel (JTable で使用するため) を構築しようとしています。これらのオブジェクトの一部にはデータ構造が含まれており、それらの構造を表示したくありません。したがって、コレクションから最初のオブジェクトを取得し、AbstractMap または Collection クラスから割り当てられない宣言されたフィールドを要求することで、列名を取得しています。これは私にとってはうまくいくようです。これまでのところ、必要なフィールドのみを取得しています。労働者を見せようとすると問題が始まります。ワーカー用のほとんどのフィールドを持つ W_Worker 抽象クラスがあり、W_Manager、W_FuelWorker などのさまざまなワーカーがあります...各サブクラスには 1 つまたは 2 つのフィールドしかありません。

クラスが別のクラスを拡張し、それらのフィールドを最初に取得するようにする場合、メソッドの最初にどのように判断できますか?

これで十分に理解できない場合は、コードを提供します。前もって感謝します、タル

編集:コードが追加されました。

public String[] getColumnName(Collection<T> collection){
     Field fields[] = null;
     String fieldsNames[];
     ArrayList<String> desiredFields = new ArrayList<>();

     for(Object o : collection){
        fields = o.getClass().getDeclaredFields();
        if (o instanceof W_Worker){
            Field[] superFields = o.getClass().getSuperclass().getDeclaredFields();
            Field[] result = new Field[superFields.length + fields.length];
            System.arraycopy(superFields, 0, result, 0, superFields.length);
            System.arraycopy(fields, 0, result, superFields.length, fields.length);
            fields = result;
        }
        break;
     }
     fieldsNames = new String[fields.length];
     for(int i = 0; i<fields.length ;i++){
         if (!Collection.class.isAssignableFrom(fields[i].getType()) && !AbstractMap.class.isAssignableFrom(fields[i].getType())){
            fieldsNames[i] = fields[i].getName();
         }
     }
     for(String field : fieldsNames){
         if (field != null){
             desiredFields.add(field);
         }
     }
     String newFields[] = new String[desiredFields.size()];
     return desiredFields.toArray(newFields);
 }

ご覧のとおり、私は現在 instanceof を使用していますが、W_Worker でのみ機能するため、これは十分に汎用的ではありません。

4

4 に答える 4

1

これにはビジターパターンを検討します。訪問者は、TableModel の処理方法を知っています。

ややこのように:

public class TableModelVisitor {

   private TableModel model;

   public void visit(Terminal terminal) {
      terminal.accept(this);
   }
   public void visit(Runway runway) {
      runway.accept(this);
   }
   public void visit(Worker worker) {
      worker.accept(this);
   }

   //your methods to treat the model
}

次に、すべてのノードが訪問者を処理するようにし、モデルにデータを入力するようなことをするように依頼できます。

public class Worker {
   public void accept(TableModelVisitor tableModelVisitor) {
      //and here you know everything about your worker and its fields
      //and have access to your visitor table model to configure it.
      tableModelVistor.addField(this.getMyField1());
      tableModelVistor.addField(this.getMyField2());
   }
}

最後に、TableModelVisitor を作成し、必要なモデルを設定するように要求するだけです。

TableModelVisitor visitor = new TableModelVisitor(myTableModel);
visitor.visit(anyOfMyObjects);
于 2013-08-19T17:40:14.553 に答える
0

みんなありがとう、GenericTableModel を変更して、オブジェクトに必要なフィールドを含むコレクションと文字列の配列を受け取ることになりました。このようにして、ジェネリックを静止させ、プロジェクトに最適な結果を得ることができました。

返信と時間をありがとう。

于 2013-09-17T13:58:40.220 に答える
0

どのクラスについても、リフレクションを使用して拡張および/または実装するものを確認できます。その後、所有しているさまざまなワーカー クラスのタイプと比較を行い、適切なメソッドを呼び出します。完全に機能する例はトレイルにあります: http://docs.oracle.com/javase/tutorial/reflect/class/classModifiers.html

于 2013-08-19T17:35:57.580 に答える
0

おそらく Class.getDeclaredFields メソッドを使用しています。Class.getFields が必要です。詳細はこちら: http://forgetfulprogrammer.wordpress.com/2011/06/13/java-reflection-class-getfields-and-class-getdeclaredfields/

于 2013-08-19T17:35:14.160 に答える