当前位置: 首页 > 知识库问答 >
问题:

在无限循环中执行事件

微生曾琪
2023-03-14
public void actionPerformed(ActionEvent event)
    {
        // TODO Auto-generated method stub
        JButton src = (JButton) event.getSource();   //get which button is clicked

        if(src.equals(GO))     //if GO button is clicked
        {
            try {
                runHack();
            } catch (AWTException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(src.equals(STOP))   //if STOP button is clicked
        {
            //do nothing
            FeedBack.setText(null);
            FeedBack.setText("Stopped");

        }
    }

我有一个程序,当你点击按钮GO,它将执行一个名为runHack()的方法

 private void runHack() throws AWTException 
 {
    FeedBack.setText(null);
    FeedBack.setText("Running(This doesn't print out)");

   while(true)//infinite loop
   {
        FeedBack.setText("This doesn't print out");
   }
}

runHack()是一种运行无限循环的方法。当我点击GO按钮时,程序在执行runHack()方法时冻结。字符串“Running”不会显示在JLabel反馈上。

我的问题是,当程序处于无限循环中时,如何使事件仍然可用?我希望这样,当我按下停止按钮时,程序退出无限循环。此外,我希望JLabel反馈在循环中起作用。


共有2个答案

庾奇思
2023-03-14

简短回答:

SwingUtilities.invokeLater(new Runnable() {
 @Override
 public void run(){
   runHack();
 }
}).start();

只要考虑到有更好的方法来产生新线程,比如使用执行器。就像有人评论的那样,线程是一个广泛的话题,你应该阅读文档。

[编辑]就像“气垫船充满鳗鱼”说的那样,线程不安全,需要对UI进行新的线程修改。

胡和煦
2023-03-14

你需要在一个新的线程中运行这个内线嘟嘟。这是如何使用定时器。swing timer在单独的线程中运行。将延迟设置为零。所以它是一个while(真的)循环。在你的代码中,由于长期任务(无限循环),你正在阻止EDT。您对文本字段所做的更改不会得到更新,因为EDT被阻止。

您需要摆动定时器而不是java.util.定时器

import import javax.swing.Timer; 

声明计时器

Timer t;//global declaration;

初始化//

 t=new Timer(0, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        FeedBack.setText("This doesn't print out");
    }
});

当按钮点击//

 JButton src = (JButton) event.getSource();   //get which button is clicked

    if(src.equals(GO))     //if GO button is clicked
    {
        try {
            t.start();
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
    if(src.equals(STOP))   //if STOP button is clicked
    {
        //do nothing
        t.stop();
        FeedBack.setText(null);
        FeedBack.setText("Stopped");

    }

更新。。。

一个完整的例子

import java.awt.AWTException;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;

public class example extends JFrame implements ActionListener{

    Timer t;
    private final JTextField FeedBack;
    private JButton go;
    private JButton stop;
    int i=0;

    public example() {
         FeedBack=new JTextField("initial text");
         go=new JButton("go");
         stop=new JButton("stop");
           go.addActionListener(this);
           stop.addActionListener(this);

        this.setLayout(new GridLayout(1, 3));
        this.add(go);
        this.add(stop);
        this.add(FeedBack);
        this.setVisible(true);

        t = new Timer(0, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                FeedBack.setText(i+"");
                i++;
            }
        });

    }

    public void actionPerformed(ActionEvent event) {

        JButton src = (JButton) event.getSource();
        System.out.println(src);
        if (src==go) //if GO button is clicked
        {               
            t.start();
        }
        if (src==stop) //if STOP button is clicked
        {
            //stop timer
            t.stop();
            //FeedBack.setText(null);
            FeedBack.setText("Stopped");

        }
    }

    public static void main(String[] args) {
        example f = new example();
    }
}

输出

 类似资料:
  • 在我目前使用Netty的大多数示例中,我看到boss执行器是一个缓存线程池。根据我的理解,事件循环应该只有一个线程,为什么我们需要boss事件循环的缓存线程池?

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 问题内容: 我希望代码在后台运行并定期更新我的GUI。我该怎么做? 例如,假设我想在GUI代码的背景中执行以下操作,如下所示: 这是GUI代码: 问题答案: 尚不清楚顶部的代码应该做什么,但是,如果只想每秒(或每秒钟)调用一个函数,则可以使用该方法。 因此,如果您只想使用进行操作,则可能需要执行以下操作: 您可以将此函数作为您类的方法(在本例中称为),您的代码将如下所示:

  • 问题内容: 当我在 while循环中 使用 try和catch 块时,我的程序有一个无限 循环 。 当我输入一个整数时,它运行良好并要求另一个输入,但是当我输入一个字符时,它将进入无穷循环。为什么会这样呢? 问题答案: 遇到无效输入时,由于nextInt()不使用无效令牌,因此程序进入无限循环。因此,导致该异常的任何令牌都将保留在该位置,并在下次尝试使用nextInt()时继续引发异常。 可以通过

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循