当前位置: 首页 > 知识库问答 >
问题:

Java输入键和提交键一样吗?

禄俊逸
2023-03-14

程序应该做的是用回车键模仿“旋转”按钮。该程序可以工作并且不会崩溃,但是 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,因为我正在从字母中过滤掉数字,这样我就可以使用事件。不能有用户用字母下注,对吗?

共有2个答案

冯皓
2023-03-14

首先,不要将< code>KeyListener用于此任务,< code>JTextField已经支持< code>ActionListener,您也可以利用< code>JRootPane的“默认按钮”支持,因此有许多更好的html" target="_blank">解决方案可用。

您还应该利用 ActionEvent(和 ActionListener)的 actionComamnd 支持,这意味着您不必强制转换源代码,这更安全并使解决方案更可重用(因为它是分离的)。

例如

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
        }
    }
}

或者,您可以利用现有的< code > Action API。这使您可以设计一个自包含的工作单元,它可以直接应用于许多Swing组件(这些组件已经支持< code>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);

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

汪阿苏
2023-03-14

我猜您的< code>ActionListener正在从多个对象接收事件,其中一个是< code>JTextField。当您尝试将此对象强制转换为< code>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
            }
        }
    }
}
 类似资料:
  • 问题内容: 我有HTML两种形式,一种使用PHP进入数据库时​​提交数据,另一种将用户定向到Paypal付款页面,我的问题是用户将不得不同时提交两种形式,我当然不希望它们必须做。无论如何,对于两种形式都可以使用一个提交按钮吗? (欢迎使用Javascript) 问题答案: 您应该能够使用JavaScript做到这一点: 如果您的表单具有ID: 如果您的表单没有ID,但有名称:

  • 问题内容: 我正在开发用于库存管理的应用程序。 操作是,通过在中键入项目代码并按键,该代码的详细信息应显示在。在这里,我必须输入数量,然后按计算数量。但是,现在通过提供商品代码,详细信息到达,我可以键入数量,但是通过按键将焦点移到下一行,并且不进行任何计算。但是,再次按键,将计算出最后输入的金额。我是Java的初学者,所以我不知道如何解决此问题。我在Netbeans中使用MySQL和Java。 我

  • 问题内容: 我有HTML两种形式,一种使用PHP进入数据库时​​提交数据,另一种将用户定向到Paypal付款页面,我的问题是用户将不得不同时提交两种形式,我当然不希望它们必须做。无论如何,对于两种形式都可以使用一个提交按钮吗? (欢迎使用Javascript) 问题答案: 您应该能够使用JavaScript做到这一点: 如果您的表单具有ID: 如果您的表单没有ID,但有名称:

  • 如何在用户输入时更新< code>p:inputText的样式而不打断他们的输入? 这是为了验证。它可以很好地更新并获得正确的样式,但是当< code>p:inputText更新时,它会将光标设置回起点...中断用户的输入。总要有一种侵入性更小的方式来更新风格吧?

  • 问题内容: 我正在用Java编写游戏,现在是Swing + JOGL-一个带有GLCanvas的JFrame。 我使用etc.事件()处理输入,但似乎无法正常工作: 当我同时按下3个以上的键时,它们无法正确注册 -显然这是键盘的错误,我必须找到替代的控制方案。 窗口丢失后,重新获得焦点,输入完全停止工作… 我究竟做错了什么? 有没有更好的方法来处理Java中的键盘输入? (除非我别无选择,否则我不

  • 目前为止,我们的脚本都没有交互。也就是说,它们都不需要用户的输入。本节,我们将学习脚本如何问问题,并获取以及使用其响应。 read 要从键盘读取输入,使用 read 命令。read 命令从键盘读取输入并将其赋值给一个变量。例如: #!/bin/bash echo -n "Enter some text > " read text echo "You entered: $text" 注意 ech

  • 我想要功能 只需输入--EditText返回并提交文本 Shift+Enter--在EditText中新建行 在layout.xml中:

  • 问题内容: 我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接。我在下面的课程搜索所有带有发射器的Midi设备。它成功找到了我的Midi键盘。我将自己的接收器添加到每个设备的每个发送器中,以便它可以接收所有可能的信息。通过阅读所有帮助文档和Java文档,我知道Transmitter将MidiEvents发送给Receiver,然后由Receiver使用send方法处理它们。因此,我