投射JMenuItem

时间:2016-01-01 20:27:29

标签: java swing jbutton jmenuitem

在我的actionPerformed方法中,我有以下两行代码,

JButton pressed =(JButton)e.getSource();
JMenuItem pressedSave = (JMenuItem)e.getSource();

为什么不允许这样做?我得到以下编译器错误

  

线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:javax.swing.JButton无法强制转换为javax.swing.JMenuItem

我需要能够获得JButtonJMenuItem的文字。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

错误很明显。您正尝试将Jbutton分配给JMenuItem

您在第2行上收到错误,这意味着第1行是完美的,这也意味着e.getSource()JButton ,而不是JMenuItem

您可以使用instanceof运算符来确定触发事件的组件:

Object comp = e.getSource();

if(comp instanceof JButton) {
    // A JButton triggered the event
    JButton pressed =(JButton) comp;

    // Do something with your 'pressed' button
}
else if(comp instanceof JMenuItem) {
    // A JMenuItem triggered the event
    JMenuItem pressedSave = (JMenuItem) comp;

    // Do something with your 'pressedSave' menu item
}

答案 1 :(得分:1)

您没有收到编译错误。

“允许”,它只是不起作用。

如果不允许,则编译器会抱怨。

但是你在这里得到的是一个RuntimeException,因为你一个JButton,它根本无法转换为JMenuItem。它们是不相关的类型 - 这两者之间的转换/转换应该如何?

所能做的是将JButtonJMenuItem这两种类型投射到其常用超类型AbstractButton

答案 2 :(得分:1)

JMenuItem不是JButton的子类,但是你可以将它们都转换为AbstractButton。这可能会取决于你想做什么