当前位置: 首页 > 面试题库 >

如何在Swing中创建延迟

洪景铄
2023-03-14
问题内容

我做了一个二十一点游戏,我想让AI播放器在两张牌之间暂停一下。我尝试仅使用Thread.sleep(x)进行尝试,但这会使冻结,直到AI播放器拿走了他所有的卡。我知道Swing不是线程安全的,所以我看了Timers,但是我不明白如何使用它。这是我当前的代码:

while (JB.total < 21) {

          try {
            Thread.sleep(1000);
          } catch (InterruptedException ex) {
            System.out.println("Oh noes!");
          }

          switch (getJBTable(JB.total, JB.aces > 0)) {
            case 0:
              JB.hit();
              break;
            case 1:
              break done;
            case 2:
              JB.hit();
              JB.bet *= 2;
              break done;
          }
        }

BTW,hit(); 方法更新GUI。


问题答案:

好吧,下面的代码显示了一个带有JTextArea和JButton的JFrame。单击按钮后,计时器将事件重复发送(事件之间有第二个延迟)到与按钮相关的actionListener,后者在当前时间后追加一行。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.Timer;


public class TimerTest extends JFrame implements ActionListener{

    private static final long serialVersionUID = 7416567620110237028L;
    JTextArea area;
    Timer timer;
    int count; // Counts the number of sendings done by the timer
    boolean running; // Indicates if the timer is started (true) or stopped (false)

    public TimerTest() {
        super("Test");
        setBounds(30,30,500,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        area = new JTextArea();
        area.setBounds(0, 0, 500, 400);
        add(area);

        JButton button = new JButton("Click Me!");
        button.addActionListener(this);
        button.setBounds(200, 400, 100, 40);
        add(button);

        // Initialization of the timer. 1 second delay and this class as ActionListener
        timer = new Timer(1000, this);
        timer.setRepeats(true); // Send events until someone stops it
        count = 0; // in the beginning, 0 events sended by timer
        running = false;
        System.out.println(timer.isRepeats());
        setVisible(true); // Shows the frame
    }

    public void actionPerformed(ActionEvent e) {
        if (! running) {
            timer.start();
            running = true;
        }
        // Writing the current time and increasing the cont times
        area.append(Calendar.getInstance().getTime().toString()+"\n");
        count++;
        if (count == 10) {
            timer.stop();
            count = 0;
            running = false;
        }
    }

    public static void main(String[] args) {
        // Executing the frame with its Timer
        new TimerTest();
    }
}

好的,此代码是如何使用javax.swig.Timer对象的示例。关于问题的具体情况。停止计时器的if语句必须更改,并且显然必须更改actionPerformed的操作。以下片段是解决方案actionPerformed的框架:

public void actionPerformed(ActionEvent e) {
    if (e.getComponent() == myDealerComponent()) {
    // I do this if statement because the actionPerformed can treat more components
        if (! running) {
            timer.start();
            runnig = true;
        }
        // Hit a card if it must be hitted
        switch (getJBTable(JB.total, JB.aces > 0)) {
          case 0:
              JB.hit();
              break;
          case 1:
              break done;
          case 2:
              JB.hit();
              JB.bet *= 2;
              break done;
        }
        if (JB.total >= 21) { // In this case we don't need count the number of times, only check the JB.total 21 reached
            timer.stop()
            running = false;
        }

    }
}

恕我直言,这可以解决问题,现在@ user920769必须考虑将actionListener和启动/停止条件放在哪里…

@kleopatra:感谢您向我展示这个计时器类的存在,对此我一无所知,这真是太神奇了,它可以将很多任务分配到一个swing应用程序中:)



 类似资料:
  • 问题内容: 我想暂时暂停我的应用。换句话说,我希望我的应用执行代码,但是在某个时候暂停4秒钟,然后继续执行其余的代码。我怎样才能做到这一点? 我正在使用Swift。 问题答案: 如果要从UI线程调用该方法,则可以考虑使用或调度计时器,而不是进行睡眠(这会锁定您的程序)。 但是,如果您确实需要延迟当前线程: 这使用UNIX中的功能。

  • 问题内容: 我目前正在尝试学习nodejs,而我正在做的一个小项目正在编写一个API,以控制一些联网的LED灯。 控制LED的微处理器具有处理延迟,我需要将发送给微控制器的命令间隔至少100毫秒。在C#中,我习惯于仅调用Thread.Sleep(time),但在node中没有找到类似的功能。 我已经找到了在节点中使用setTimeout(…)函数的几种解决方案,但是,这是异步的并且不会阻塞线程(这

  • 我正在用java重新创建经典的街机游戏《太空入侵者》。我的问题是在杀死敌人后处理精灵时出现的。因为死亡精灵是一个敌人可以拥有的精灵之一,所以我基本上要做的是改变显示的精灵,然后移除敌人的物体。有没有办法让精灵显示一秒钟左右,然后移除敌人的物体?我也愿意用其他方法来做类似的事情,因为它可能没有我想象过的其他方法那么有效。 编辑:我以前应该提到这个,但是任何涉及睡眠线程的事情都会导致整个游戏延迟,这是

  • 你好,我想在java swing中创建一个Jlist,但是我不知道在哪里可以显示它。到目前为止,我看到的所有教程都在一个新窗口中创建列表,这不是我想要的。我想使用一个工具或其他东西来给出我当前所在的框架的具体坐标和位置。我是java swing新手,所以我可能需要一些帮助。我使用windows builder pro作为eclipse的插件。有没有什么工具可以让我用来“画”出列表的显示位置? Th

  • 问题内容: 我想知道如何在Java中的Swing应用程序中添加时间延迟,我使用,并且我也使用了SwingWorker,但是它不起作用。这是我的代码的一部分: 我希望您在使用SwingWorker时能帮助我或解决我的疑问。 问题答案: 这是一个使用

  • 问题内容: 我当前正在通过右键单击实例化并将其位置设置为鼠标位置的位置来创建右键单击上下文菜单。是否有更好的方法? 问题答案: 您可能正在手动调用菜单。这会导致菜单中出现一些令人讨厌的越野车行为。 该方法处理所有需要发生的事情(在鼠标悬停时突出显示事情,并在必要时关闭弹出窗口),其中使用只是显示菜单而无需添加任何其他行为。 要进行右键单击弹出菜单,只需创建一个。 然后,您所要做的就是向要弹出菜单的