Java:等待ActionEvent

3

我希望能够让一个方法在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调用? - Hovercraft Full Of Eels
1
看起来你正在等待用户在文本字段中输入数据。那么为什么不显示一个 JOptionPane 来要求用户输入数据呢? - camickr
2个回答

3

CountDownLatch可以解决这个问题。你想创建一个等待1个信号的门闩。

在actionPerformed中,你需要调用countDown(),在"method"中你只需要等待await()。

-编辑-

我假设你已经设置好了处理情况所需的正确线程数。


2
你发布的链接已经过时了,这里是 CountDownLatch 的当前 API:http://download.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html - Hunter McMillen
2
哈哈哈,谢谢。这是从谷歌返回的第一个结果。以后要记得在搜索中加入Java 7。 - pimaster
"以后一定要记得在搜索中加入Java 7。您也可以投票支持这个RFE,这样我们就可以链接到“最新”的JavaDocs(并且链接将保持稳定)"。 - Andrew Thompson
[OT] @Andrew Thompson可能会这样做,但投票并不像预期的那么容易(事实上,目前对我来说是不可能的吗?)https://forums.oracle.com/forums/thread.jspa?threadID=2310897&tstart=15 - kleopatra
@kleopatra 我明白你的意思。只用了6分钟我就成功登录到了Bug数据库,但是当我想回复你在OTN上发布的帖子时,遇到了愚蠢的"500内部服务器错误"消息。 :( - Andrew Thompson
显示剩余2条评论

1

有很多方法,CountDownLatch 是其中之一。另一种方式是使用可重用的 Semaphore。

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!");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接