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 如何为空:

  1. 您将 null 值传递给构造函数
  2. 您没有在 Swing EDT 中实例化 NewSlider 并且遇到了一些奇怪的缓存问题
  3. NewSlider 正在通过反射/反序列化构建,并且未设置颜色。

您是否尝试过在带有一些断点的调试器中运行它?我很想确保调用 NewSlider 构造函数(并且在 NewSliderUI 构造函数之前)。

编辑:我明白你在下面的意思。我忘记了 JSlider 的无参数构造函数被隐式调用。如何执行以下操作:

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() 两次,但最终结果应该是您想要的。

于 2010-01-26T18:23:34.600 回答