【问题标题】:Waiting for an event with Java swing使用 Java swing 等待事件
【发布时间】:2021-05-09 10:16:44
【问题描述】:

我有一个名为“Text”的 Java 类,它使用 swing 来创建 2 个文本框。其中有一个侦听器将文本从第一个框复制到第二个框的末尾。到目前为止,我已经将它设置为其他类可以调用函数以将文本输出到第二个框的位置。

我想要做的是有一个函数让程序等到用户输入一个文本字符串并按下回车键(这将触发我已经拥有的事件侦听器),然后将该文本字符串返回到用户。

我尝试做类似的事情:

String lastInput;
boolean waiting;

    public void actionPerformed(ActionEvent evt) {
        String text = textField.getText();
        println(text);
        lastInput = text;
        waiting = false;
        parse(text);
        textField.selectAll();
    }

    public String get() {
        waiting = true;
        while(waiting){}
        return lastInput;
    }

但这只会导致程序冻结而不注册任何输入(包括在文本框中输入的任何内容)。我很确定我需要使用 java 的线程系统,但是我以前从未使用过它,而且我在网上找不到任何关于如何使用它来解决这个问题的信息。

谢谢!

【问题讨论】:

    标签: java swing asynchronous events io


    【解决方案1】:

    我很确定我需要使用 java 的线程系统,

    这不是您设计 GUI 的方式。通常,GUI 坐在那里什么都不做。想想你的浏览器,它只在用户产生事件时才做一些事情,例如,通过使用键盘或鼠标。

    我想做的是有一个函数让程序等到用户输入一串文本并按下回车键

    如果您想提示用户输入文本,那么您可能应该使用JOptionPane。阅读How to Make Dialogs 上的 Swing 教程以获取一些示例。

    如果您确实遇到需要在表单的文本字段中输入文本时进行处理的情况,那么您可以在文本字段中添加ActionListener

    请参阅:How to Use Text Fields

    TextDemo 示例将在文本字段上按 Enter 时将文本从文本字段复制到文本区域。

    【讨论】:

      【解决方案2】:

      首先,这里的主要问题是while循环,它是一个无限循环。如果使用单线程,那么一旦循环执行,就没有可以调用“actionPerformed”方法的空闲上下文了。

      主要问题是具有不同的上下文:一个将执行“get”方法,一个将在触发器调用后执行“actionPerformed”。

      还有两件事:

      1. 您的“get”函数名称不正确,可能会造成混淆。 Get 用于 getter(访问类的成员)。
      2. 使用线程安全的等待布尔值(AtomicBoolean 之类的)。

      【讨论】:

        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多