1

Java の内部メソッドにはほとんど問題がありません。列をなして:

dReservation[i].dispose();

エラーがあります:

別のメソッドで定義された内部クラス内の非最終変数 dReservation を参照できません

フォーラムで多くのスレッドを読みましたが、うまくいかなかった問題の解決策が 2 つあります。

別のメソッドで定義された内部クラス内の非最終変数を参照することはできません

別のメソッドで定義された内部クラス内の非最終変数 i を参照できません

非最終の「ローカル」変数を内部クラス内で使用できず、代わりに外側のクラスの非最終フィールドを使用できるのはなぜですか?

クラス ( ) のフィールドJDialog[] dReservationとして設定しようとしました。その後、私のエラーは消えますが、内側のメソッド ( ) ではなくis .globalGUIShowReservationsactionPerformeddReservation[i]null

フィールドJDialog[] dReservationとして設定したときとまったく同じ履歴です。finalですnull

bShowReservations = new JButton("Show Reservations");
bShowReservations.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
  JDialog[] dReservation = new JDialog[10000];

  for(Object o: reservations)
  {
    rez = (Reservations)o;
    reservation.append(rez.getGroup());

    dReservation[i] = new JDialog();
    dReservation[i].setSize(400, 300);
    dReservation[i].setLocationRelativeTo(null);
    dReservation[i].setVisible(false);
    dReservation[i].setLayout( null );
    dReservation[i].setTitle("Edition");

    bEditAccept = new JButton("Edit");
    bEditAccept.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            rez.setTeacher(cEditTeacher.getSelectedItem().toString());
            dao.update(rez);
            dReservation[i].dispose();
        }
    });
    bEditAccept.setSize(160, 24);
    bEditAccept.setLocation(10, 200);
    dReservation[i].add(bEditAccept);
  }
}
});

私たちを手伝ってくれますか?JDialogの代わりに、内部メソッドで適切なを表示したいnull

4

1 に答える 1

0

コードが不完全で、上記のコードはあまり意味がないため、答えるのは難しいです。私はそれが実際に何をするのかを説明します。

このコードは、「Show Reservations」というラベルの付いた単一のボタンを作成します。このボタンをクリックすると、1 万 (!) 個の JDialog インスタンスの配列が作成されます (なぜ?)。これらのダイアログはすべて null です。

次に、ループが実行され、予約が繰り返されます。予約ごとに、「編集」という名前の新しいボタンを含む新しい JDialog が作成されます。このボタンをクリックするとダイアログが閉じます。そして、これらのダイアログの最後のものは、巨大な配列のインデックス i に格納されます。他のすべてのものは、配列内の同じインデックスで次のものに置き換えられるため、無料で作成されます。

そのため、ループの最後で、予約ごとに 1 つのダイアログを作成しましたが、そのうちの 1 つだけを巨大な配列に格納しました。この巨大な配列はローカル変数であるため、配列とその固有のダイアログが範囲外になるため、このダイアログを使用することはできません。したがって、アクション リスナーは次のものと同等の処理を行いますが、非常に遅く非効率的な方法です。

bShowReservations.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
        for (Object o: reservations) {
            rez = (Reservations) o;
            reservation.append(rez.getGroup());
        }
    }
}

また、あなたのコードが悪い習慣でいっぱいだというわけではありません。汎用コレクションを使用しておらず、ボタンのサイズを設定しており、レイアウト マネージャーを使用しておらず、代わりに任意の場所を設定しています...

コードが何をすべきかを教えていただければ、それを実現するお手伝いをいたします。

于 2012-12-24T16:06:48.923 に答える