自定义Jslider初始化问题

时间:2010-01-26 18:06:59

标签: java components jslider

我正在开发一个具有自定义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);),那么它可以正常工作,但每种颜色都有一个不同的类似乎很傻。

感谢。

1 个答案:

答案 0 :(得分:1)

除非发生下列情况之一,否则我看不到kolor如何为null:

  1. 您正在将null值传递给构造函数
  2. 你没有在Swing EDT中实例化NewSlider并且有一些奇怪的缓存问题
  3. 正在通过反射/反序列化构建NewSlider,并且未设置kolor。
  4. 您是否尝试在调试器中使用某些断点运行此命令?我很想确保调用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()两次,但最终结果应该是您想要的。