【问题标题】:java.awt.event.MouseAdapter with a loop so slowlyjava.awt.event.MouseAdapter 用循环这么慢
【发布时间】:2012-12-14 05:09:55
【问题描述】:

我正在使用 JFrame 开发一个程序,我想意识到当您单击一个按钮时,另一个类中的循环必须工作。它正在工作,但速度很慢。在一秒钟内,您只能看到循环的一次迭代。我不明白为什么。您需要了解一些代码。 调用监听器:

playWithComputerButton.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            startLoop(1);
        }
    });

叫作:

if(gameMode == 2){
        int i = 0;
        while(i < 500){
            int pos = ((Computer) playerA).thinkIt(board.getBoard());
            display("bu pas : " + pos);
            i++;
        }

迭代和调用监听没有问题。 (我也尝试过其他迭代和“ActionListener”,但结果是一样的。

有什么解决办法?

【问题讨论】:

  • 需要使用SwingWorker进行与GUI无关的长操作
  • 我建议快速阅读此answer,虽然它不是一个直接的答案,但它会突出您遇到的问题以及为什么 Nikolay 的答案实际上是正确的
  • 您需要了解一些代码。 请编辑您的问题以包含一个关注问题的sscce,而不是代码。引用了几个例子here
  • 这正是我想要的。它现在工作没有任何缓慢!谢谢 Nikolay 和 Madprogrammer。 @trashgod,感谢您的反馈。我会做的。

标签: java swing loops jframe mouse-listeners


【解决方案1】:

要执行与 GUI 无关的长操作,我们可以简单地使用 javax.swing.SwingWorker,就像上面 Nikolay Kuznetsov 和 MadProgrammer 解释的那样。

这是一个如何使用它的示例:example,这是 SwingWorker 的 javadoc:javadoc

对于我的程序,解决方案是:

首先在你的 JFrame 类中创建一个新的 SwingWorker 扩展类

class LoopWorker extends SwingWorker<Integer, Integer>
{
    protected Integer doInBackground() throws Exception
    {
        // perform your loop
    }

    protected void done()
    {
        // what has to be done after performing
    }
}

然后,按钮应该调用它的执行方法如下:

learnButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent evt) {
            new LoopWorker().execute();
        }
     });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2020-10-08
    • 2018-05-24
    • 2017-03-19
    相关资源
    最近更新 更多