【问题标题】:Method not run in java listener actionPerformed方法未在 Java 侦听器 actionPerformed 中运行
【发布时间】:2013-10-11 14:45:47
【问题描述】:

我有一个独立工作的方法 myFuncs.requestData()。它订阅侦听数据并在侦听器接收到所有数据时设置 ReadyTxt="TRUE" - 这会在多个回调中出现。

但是,当我尝试在附加到按钮的 actionPerformed 方法中检查 DataReady 时 - 它未设置,因为似乎 myFuncs.requestData() 仅在我们退出 actionPerformed 之后才被处理/运行。

“独立”是指如果我没有在 ##HERE## 放置任何函数,那么 requestData() 将在 actionPerformed 完成后工作。

如何确保它运行并等待它在 ##HERE## 完成?

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);

    myFuncs.requestData();

    try {
        Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
    }
    writePaneln("REQUESTED "+myFuncs.ReadyTxt);

            ##HERE##
    }

线程版本:

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);

            Thread thread = new Thread() {
                    public void run(){
                 myFuncs.requestData();
                    }
    };

    thread.start();

    try {
        Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
    }
    writePaneln("REQUESTED "+myFuncs.ReadyTxt);

            ##HERE##
    }

简化的 requestData():

public void requestData() {

            DataReady="FALSE"
    this.dataSubscription.setListener(this);


}


@Override
public void dataUpdated(List<long> updatedData) {


    if (updatedData.size() <= 1 ){
        this.dataSubscription.destroy();

        writePaneln("In dataUpdated DataReady num: "+Dates.size());
        DataReady="TRUE";
        return;
    }

    for (long l: updatedData){
            writePaneln(l);
        Dates.add(l);
    }


}

【问题讨论】:

  • 我认为需要进一步澄清 - 你是什么意思 myFuncs.requestData() 在你退出 actionPerformed() 完成后运行?你在其他地方打电话给myFuncs.requestData() 吗?你有什么例外吗?
  • 能否提供requestData内的代码。如果没有更多细节,很难说出为什么它不能工作。在我的脑海中,我猜想一切都在同一个线程上运行。
  • @StormeHawke 我的意思是,无论我“睡”多久 requestData() 直到 actionPerformed 完成后才会运行(我可以说这是因为我的 writePaneln("REQUESTED") 在 requestData 之前写入() 确实)
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 会“冻结”。而不是调用Thread.sleep(n) 实现一个Swing Timer 用于重复任务或SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing
  • 您的问题确实需要更清楚。提供更多代码(requesData 代码会有很大帮助),您是否在做多线程并且“独立工作”仍然不清楚。我们都可以大胆猜测,但那是在浪费时间。

标签: java awt listener actionlistener


【解决方案1】:

答案似乎在于使用 TimerTask 为 AFTER actioPerformed 完全完成后的任务计时,因为它似乎在单线程上。

http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 2011-08-21
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多