该程序应该执行的操作是使用回车键模仿“旋转”按钮。该程序可以正常工作,并且不会崩溃,但是eclipse控制台在线程“ AWT-EventQueue-0”中给我一个“ 异常” java.lang.ClassCastException:javax.swing.JTextField无法转换为javax。 swing.JButton ”错误。
//.. gui code
spin = new JButton("Spin");
bet = new JTextField("");
play p = new play();
spin.addActionListener(p);
keys k = new keys();
bet.addKeyListener(k);
}
private class play implements ActionListener{
public void actionPerformed(ActionEvent e) {
JButton src = (JButton) e.getSource();
if(src.equals(spin)) {
//do something
}
}
private class keys implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
char c= e.getKeyChar();
if(c == KeyEvent.VK_ENTER) {
spin.doClick();
}
}
//.. the other override methods
}
编辑
答案 0 :(得分:0)
我猜您的ActionListener
正在接收来自多个对象的事件,其中一个是JTextField
。当您尝试将此对象强制转换为JButton
时,会发生异常:
(JButton) e.getSource();
也许有更好的解决方案,但从您的角度来看,防止异常的最简单方法是在强制转换之前检查对象的生成是否是JButton
的实例:
private class play implements ActionListener{
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
// Check type before casting
if (src instanceof JButton) {
JButton bsrc = (JButton)src;
if(bsrc.equals(spin)) {
//do something
}
}
}
}
答案 1 :(得分:0)
首先,不要使用KeyListener
来完成此任务,JTextField
已经支持ActionListener
,并且您也可以利用JRootPane
的“默认按钮”支持,因此可以使用许多更好的解决方案。
您还应该利用actionComamnd
(和ActionEvent
)的ActionListener
支持,这意味着您不必强制转换源,这更安全并且可以该解决方案更可重用(因为它已经解耦了)。
例如...
Play p = new Play();
spin = new JButton("Spin");
spin.setActionCommand(Play.COMMAND);
bet = new JTextField("");
bet.setActionCommand(Play.COMMAND);
spin.addActionListener(p);
bet.addActionListener(p);
//...
private static class Play implements ActionListener {
public static String COMMAND = "Spin";
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(COMMAND)) {
//do something
}
}
}
或者,您可以使用现有的Action
的API。这使您可以设计一个独立的工作单元,该工作单元可以直接应用于许多Swing组件(已经支持ActionListener
API),但是它们也是可自我配置的,整洁的...
private class SpinAction extends AbstractAction {
public SpinAction() {
putValue(NAME, "Spin");
}
@Override
public void actionPerformed(ActionEvent event) {
// Spin me baby
}
}
然后简单地应用它...
SpinAction action = new SpinAction();
spin = new JButton(action);
bet = new JTextField("");
bet.setAction(action);
有关更多详细信息,请参见How to use actions