Java输入键是否与提交按钮相同?

问题描述 投票:0回答:2

该程序应该做的是使用Enter键模仿“旋转”按钮。该程序可以正常工作,并且不会崩溃,但是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
}

编辑

  • 还有2个按钮,我只是不包括它们,因为它们可以正常工作并且功能不同。
  • JTextField具有KeyListener,因为我从字母中过滤出了数字,所以我会使用该事件。用户不能用字母下注吗?
java swing actionlistener
2个回答
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
            }
        }
    }
}

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 s 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了解更多详细信息

© www.soinside.com 2019 - 2024. All rights reserved.