使用 Java swing 等待事件

Waiting for an event with Java swing

提问人:highQualityBean 提问时间:2/5/2021 更新时间:2/5/2021 访问量:461

问:

我有一个名为“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 异步 事件 IO

评论


答:

4赞 camickr 2/5/2021 #1

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

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

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

如果要提示用户输入文本,则可能应使用 .阅读有关如何制作对话框的 Swing 教程,了解一些示例。JOptionPane

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

请参见:如何使用文本字段

该示例会在按下文本字段时将文本从文本字段复制到文本区域。TextDemoEnter

1赞 javadev 2/5/2021 #2

首先,这里的主要问题是 while 循环,这是一个无限循环。如果使用单个线程,则一旦执行循环,将没有可以调用“actionPerformed”方法的自由上下文。

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

还有两件事:

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