【问题标题】:While Loops - TimedWhile 循环 - 定时
【发布时间】:2016-01-14 14:22:57
【问题描述】:

我正在重新创建一个非常糟糕的 cookie clicker 版本,只是为了测试一下我的技能。好吧,我遇到了一个问题,我不知道如何每 3 秒重复一次循环。 主类代码:

import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class CookieClickerGame {
    private static final int FRAME_WIDTH = 200;
    private static final int FRAME_HEIGHT = 200;

    public static void main(String[] args) {
        JPanel panel = new JPanel();

        JFrame frame = new JFrame();
        JButton cookie = new JButton("Cookie");
        JButton grandma = new JButton("Grandma");
        JButton robot = new JButton("Robot");
        panel.add(cookie);
        panel.add(grandma);
        panel.add(robot);
        frame.add(panel);

          /*----------------------------------------/
         /              Buttons                    /
        /----------------------------------------*/
        ActionListener listener = new CookieClicker();
        cookie.addActionListener(listener);

        ActionListener listener2 = new CookieClicker();
        grandma.addActionListener(listener2);

        ActionListener listener3 = new CookieClicker();
        robot.addActionListener(listener3);

          /*---------------------------------------------------------/
         /                       Frame                              /
        /---------------------------------------------------------*/
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

监听代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class CookieClicker implements ActionListener {
    static int cookies;
    public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("Cookie")) {
            cookies++;
            System.out.print('\f');
            System.out.println(cookies + " Cookies");
        } else if (event.getActionCommand().equals("Grandma") && cookies >= 10) {
            System.out.println("+1 Grandma | -10 Cookies");
            cookies = cookies - 10;
            System.out.println(cookies + " Cookies");
            while (true) {
                cookies = cookies + 1;
                System.out.print('\f');
                System.out.println(cookies + " Cookies");
                Thread.sleep(3000);
               }
        } else if (event.getActionCommand().equals("Robot") && cookies >= 50) {
            System.out.println("+1 Robot | -50 Cookies");
            cookies = cookies - 50;
            System.out.println(cookies + " Cookies");
            cookies = cookies + 1;
            System.out.print('\f');
            System.out.println(cookies + " Cookies");
        } else {
            JOptionPane.showMessageDialog (null, "Not Enough Cookies", "You're Poor", JOptionPane.INFORMATION_MESSAGE);
           }
       }
    }

Thread.sleep(3000) 不工作,有什么问题?

【问题讨论】:

  • 定义isn't working
  • 以 try..catch 开头
  • Thread.sleep() 很容易抛出一个必须在某处捕获的异常......谷歌是你的朋友:)
  • 我知道,这有点无聊,但通常“自下而上”而不是“自上而下”学习东西更容易。含义:您应该首先了解 Java 的基本基础;在尝试解决更高级的难题之前。所以:“try/catch”是非常基础的; Swing 应用程序、线程和其他......在某种程度上更先进。换句话说:看起来你愿意建造一座摩天大楼;但你缺乏用铁锹挖地下室洞的技能……

标签: java swing while-loop sleep


【解决方案1】:

Swing 是一个单线程框架,您永远不应尝试在事件调度线程的上下文中执行任何长时间运行或阻塞的操作。

查看Concurrency in Swing了解更多详情

虽然您可以使用 Thread 来解决问题,但更简单的解决方案是使用 Swing Timer,因为它的事件回调是在事件调度线程的上下文中触发的,因此可以安全地更新内部用户界面

详情请见How to use Swing Timers

类似...

} else if (event.getActionCommand().equals("Grandma") && cookies >= 10) {
    System.out.println("+1 Grandma | -10 Cookies");
    cookies = cookies - 10;
    System.out.println(cookies + " Cookies");
    if (timer == null || !timer.isRunning()) {
        timer = new Timer(3000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cookies = cookies + 1;
                System.out.print('\f');
                System.out.println(cookies + " Cookies");
                // I don't know what your exit condition is, but you can use
                // ((Timer)e.getSource()).stop();
                // to stop the timer from repeating
            }

        });
        timer.start();
    }
}

例如

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多