首页 > 解决方案 > Java输入键与提交按钮相同吗?

问题描述

该程序应该做的是用回车键模仿“旋转”按钮。该程序可以运行并且不会崩溃,但 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
}

编辑

标签: javaswingactionlistener

解决方案


首先,不要KeyListener用于此任务,JTextField已经支持ActionListener并且您也可以使用JRootPane“默认按钮”支持,因此可以使用许多更好的解决方案。

您还应该利用(and ) 的actionComamnd支持,这意味着您不必强制转换源代码,这更安全并且使解决方案更易于重用(因为它是解耦的)。ActionEventActionListener

例如...

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的 s API。这允许您设计一个自包含的工作单元,可以直接应用于许多 Swing 组件(已经支持ActionListenerAPI),但它们也是可自我配置的,整洁的......

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);

有关更多详细信息,请参阅如何使用操作


推荐阅读