1

カスタムの Track Rectangle を持つカスタム JSlider に取り組んでいます。最初にスライダーを宣言するときに、トラックの四角形の色を設定する機能が必要です。

これが私が持っているもののスニペットです(クラスは同じパッケージ内の別々のファイルにあります):

public class NewSlider extends JSlider {

   Color kolor;

public NewSlider (Color k) {

   kolor = k;
   }

public void updateUI() {
    setUI(new NewSliderUI(this, kolor);

    updateLabelUIs();
    }
}

public class NewSliderUI extends BasicSliderUI {

Color sliderColor = Color.BLACK;

public NewSliderUI (JSlider b, Color k) {
   super(b);

   sliderColor = k;
   }

} 

上記のコードでは、「kolor」は最初は null であり、NewSliderUI が使用しようとするとエラーが発生します。updateUI()メソッドが何よりも先に呼び出されているようです。次に、NewSlider コンストラクターが呼び出されます。さまざまなことを試しましたが、updateUI() が何よりも先に実行されるように見えるため、NewSlider クラスに追加するものは何も問題にならないようです。

色をハードコードすると (つまりsetUI(new NewSliderUI(this, Color.BLACK);)、機能しますが、色ごとに異なるクラスを持つのはばかげているようです。

ありがとう。

4

1 に答える 1

1

次のいずれかが発生しない限り、 kolor がどのように null になるかわかりません。

  1. コンストラクターに null 値を渡しています
  2. Swing EDT で NewSlider をインスタンス化しておらず、奇妙なキャッシュの問題が発生しています
  3. NewSlider はリフレクション/デシリアライゼーションによって構築されており、色は設定されていません。

いくつかのブレークポイントを使用してデバッガーでこれを実行しようとしましたか? NewSlider コンストラクターが (および NewSliderUI コンストラクターの前に) 呼び出されていることを確認したいと思います。

編集:以下の意味がわかります。JSlider の no args コンストラクターが暗黙的に呼び出されていたことを忘れていました。次のようにするとどうなりますか。

public class NewSlider extends JSlider {

   Color kolor = Color.BLACK;

   public NewSlider (Color k) {    
      kolor = k;
      updateUI();
   }

   public void updateUI() {
      setUI(new NewSliderUI(this, kolor);
      updateLabelUIs();
   }
}

最終的に updateUI() を 2 回呼び出すことになりますが、最終結果は希望どおりになるはずです。

于 2010-01-26T18:23:34.600 に答える