Внутри моего метода actionPerformed у меня есть две следующие строки кода,

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

Почему это не разрешено? Я получаю следующую ошибку компилятора

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to javax.swing.JMenuItem

Мне нужно получить текст как для JButton, так и для JMenuItem. Как я могу это сделать?

ugCode

Ответов: 3

Ответы (3)

Ошибка предельно ясна. Вы пытаетесь присвоить 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
}

Вы не получаете ошибку компилятора.

Это "разрешено", просто это не работает.

Если бы это было запрещено, то компилятор бы пожаловался.

Но здесь вы получили RuntimeException, потому что у вас есть JButton, который просто не может быть приведен к JMenuItem. Это несвязанные типы - как должно выглядеть преобразование / приведение между ними?

Что вы можете сделать, так это привести оба типа JButton и JMenuItem к их общему супертипу AbstractButton.

JMenuItem не является подклассом JButton, однако вы можете привести оба к AbstractButton. Это может сработать в зависимости от того, что вы хотите сделать

2022 WebDevInsider