【问题标题】:Java: wait for ActionEventJava:等待动作事件
【发布时间】:2012-01-01 18:02:15
【问题描述】:

我想让一个方法等到 ActionEvent 方法处理完毕后再继续。 示例:

public void actionPerformed(ActionEvent evt) {

    someBoolean = false;

}

actionPerformed 方法链接到我拥有的一个 textField,当您按 Enter 时触发该方法。我想要做的是有一个不同的方法暂停,直到 actionPerformed 方法发生。 示例:

public void method() {

    System.out.println("stuff is happening");
    //pause here until actionPerformed happens
    System.out.println("You pressed enter!");

}

有没有办法做到这一点?

【问题讨论】:

  • 为什么要有这些花哨的体操?为什么不简单地有两个方法,一个从构造函数或其他事件调用,另一个从 JTextField 的 ActionListener 调用?
  • 看起来您正在等待用户在文本字段中输入数据。那么为什么不显示一个 JOptionPane 来要求用户输入数据呢?

标签: java swing events methods


【解决方案1】:

CountDownLatch 应该可以解决问题。您想创建一个等待 1 个信号的锁存器。

在 actionPerformed 中你想调用 countDown() 而在“方法”中你只想 await()。

-编辑- 我假设您已经设置了正确数量的线程来处理这种情况。

【讨论】:

  • 您发布的链接已过时,这里是当前的 CountDownLatch API:download.oracle.com/javase/7/docs/api/java/util/concurrent/…
  • 哈哈哈,谢谢。这是第一个从谷歌回来的。以后一定要记得把Java 7放在搜索中。
  • “以后一定要记得把 Java 7 放在搜索中。” 你也可以投票给RFE,这样我们就可以随时链接到“最新” JavaDocs(并且链接将保持稳定)。
  • [OT] @Andrew Thompson 会,但投票并不像 expexted 那样容易(事实上,目前不可能 - 仅对我而言?)forums.oracle.com/forums/…
  • @kleopatra 我明白你的意思。仅 6 分钟后,我就成功登录了 bug DB,但是当我在 OTN 上回复您的帖子时,出现了那些白痴 “500 Internal Server Error” 消息。 :(
【解决方案2】:

方法有很多,CountDownLatch 就是其中之一。使用可重用信号量的另一种方法。

private Semaphore semaphore = Semaphore(0);
public void actionPerformed(ActionEvent evt) {
    semaphore.release();
}
public void method() {
    System.out.println("stuff is happening");
    semaphore.acquire();
    System.out.println("You pressed enter!");
}

您还应该考虑正在发生的事情的顺序。如果用户多次点击输入,则应该多次计算。并且如果在等待方法获取它之后有可能出现一个动作事件。您可以执行以下操作:

private Semaphore semaphore = Semaphore(0);
public void actionPerformed(ActionEvent evt) {
    if ( semaphore.availablePermits() == 0 ) // only count one event
        semaphore.release();
}
public void method() {
    semaphore.drainPermits(); // reset the semaphore
     // this stuff possibly enables some control that will enable the event to occur
    System.out.println("stuff is happening");
    semaphore.acquire();
    System.out.println("You pressed enter!");
}

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多