我一直在为一个学校项目用Java编写一个非常基本的音乐播放器,我想通过实现一个音量滑块来增加一些声音。基本上,我一步一步地阅读如何做,它确实有效,但有一个我坦率地不理解的元素,那就是
(JSlider)event.getSource();
方法。我不明白的是什么似乎是铸造。为什么我需要将event.getSource()强制转换为JSlider?我怎么可能,因为ChangeEvent和JSlider没有(至少我的理解)子类/超类关系?
以下是完整的方法:
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider)event.getSource();
int volume = source.getValue();
setVolume(volume);
}
答案 0 :(得分:4)
方法签名是
public Object getSource()
由于它返回Object,因此必须将其转换为JSlider以将其分配给JSlider变量。一切都是对象的子类型;编译器不知道返回的Object是JSlider。
答案 1 :(得分:3)
您不会投射event
本身,而是投射嵌套的source
。
在您的情况下,您将获得source
via:
event.getSource();
你投了它,显然是因为它的类型可以转换为JSlider
。 getSouce()方法合同表示它返回一个Object
实例,因此在运行时转换它将通过,或者将失败,您将收到ClassCastException
。
答案 2 :(得分:1)
事件对象包含对生成事件的组件的引用。要从事件对象中提取该引用,请使用:
Object getSource()
由于getSource()
的返回类型是Object
(类层次结构最顶层的类),因此使用类型转换:
// listener method
public void stateChanged( ChangeEvent evt )
{
JSlider source;
source = (JSlider)evt.getSource();
. . . .
}
现在你有一个引用事件的滑块的引用,你可以使用任何滑块的方法。
答案 3 :(得分:0)
ChangeEvent包含对源对象的引用(可以是抛出ChangeEvent的任何内容)。在这种情况下,您知道它是一个JSlider,因此您可以将事件源转换为JSlider。
答案 4 :(得分:0)
这是因为可以从各种来源(Swing组件)生成事件。
由于是这种情况,您需要转换为适当的类型。
如果您没有投射到JSlider,则无法使用getValue()
方法。