我正在开发一个具有自定义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);
),那么它可以正常工作,但每种颜色都有一个不同的类似乎很傻。
感谢。
答案 0 :(得分:1)
除非发生下列情况之一,否则我看不到kolor如何为null:
您是否尝试在调试器中使用某些断点运行此命令?我很想确保调用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()两次,但最终结果应该是您想要的。