3

Swing 用の独自の JavaBean を開発しました。今、PropertyChangeListener を使用して、変更時に 2 つのプロパティをキャッチしようとしています。

問題は、JavaBean 内のプロパティの 1 つの PropertyChangeSupport が正常に機能することですが、他の宣言されたプロパティの propertyChange を起動していないようです。

私のコードの抜粋をいくつか紹介しましょう。

JCalendar Bean:

public class JCalendar extends JPanel {  
  private int startDay, endDay;  
  private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);  

  public int getStartDay() {
    return startDay;
  }

  public void setStartDay(int startDay) {
    int old = this.startDay;  
    this.startDay = startDay;  
    this.pcs.firePropertyChange("startDay", old, startDay);
  }

  public int getEndDay() {
    return endDay;
  }

  public void setEndDay(int endDay) {
    int old = this.endDay;
    this.endDay = endDay;
    this.pcs.firePropertyChange("endDay", old, endDay);
  }
}

もちろん、Bean クラスにはさらにコードがありますが、わかりやすくするために省略しています。次のような別のクラスの PropertyChangeListener を使用して、これらの propertyChanges をキャッチしようとします。

class markedDayListener implements PropertyChangeListener {

  public void propertyChange(PropertyChangeEvent arg0) {

   System.out.println(arg0.getPropertyName());

   if(arg0.getPropertyName().equals("startDay")) {
      // Do something
   } else if(arg0.getPropertyName().equals("endDay")) {
      // Do something
   }
  }
 }

これまでのところ、すべてが正しいようです。しかし、何らかの理由で、PropertyChangeSupport は、startDay が変更されたときにのみ propertyChange を発生させます。endDay を変更するとすぐに setEndDay メソッドが呼び出されますが、起動される propertyChange はないようです。どのメソッドが呼び出されたかを確認するために、単純な System.out.println() を使用してすべてのイベントをログに記録し、次のことを確認しました。

  • PropertyChangeListener が適切に追加され、startDay が変更されたときに機能します
  • setStartDay() および setEndDay() メソッドが適切に呼び出される
  • setEndDay() が呼び出されると、propertySource「endDay」を持つ propertyChangeEvent は設定されません

これを数時間試してみましたが、何が問題なのかわかりません。うまくいけば、ここの誰かが私を助けてくれます。

4

1 に答える 1

6

あなたの言うことがすべて正しい場合、唯一の説明は endDay に同じ値を再度設定することです。したがって、イベントは発生しません...

いくつかのトレースを追加して、メソッド setEndDay の「old」と「endDay」の値が正しいかどうかを確認します...

于 2009-11-11T13:04:35.827 に答える