有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

设置与my GUI的自动交互之间的延迟(Java Swing)

我现在正在编写河内之塔的游戏。我想有一个自动版本,使用我的算法,每一步之间有一个延迟。我已经尝试过使用Java的定时器,但仍然不起作用

这是我代码的计时器

public void startDelay() {
        ActionListener action = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                delayTimer.stop();
            }
        };
        delayTimer = new Timer(delay, action);
        delayTimer.setInitialDelay(500);
}

这是我想使用它的一个例子

public void algorithm() {
        while(tower3.count() != 3) {
            move1();
            move2();
            move3();

        }
    }

    public void move1() {

        getHeadLength();

        if (tower3.count() == 3) {
            return;
        }

        if (headT1 > headT3 && headT3 != 0) {
            getBlock(tower3);
            startDelay();
            setBlock(tower1);
            startDelay();
            commitChange();
            startDelay();
            return;
        }
}

有人知道我该如何实施吗


共 (2) 个答案

  1. # 1 楼答案

    计时器用于安排未来的活动。它不会停止当前的处理

    例如,用于第一个`setDelay()代码的ActionListener可能会被更改为执行两件事:

    1. 洛克大厦(…)
    2. 启动另一个计时器

    第二个计时器将执行以下操作:

    1. commitChange()

    因此,代码的基本结构需要更改,以调用一系列计时器,每个计时器执行不同的功能

    或者另一种方法是使用一个计时器来跟踪计时器的当前state。因此,每当计时器触发时,您都会检查状态,然后为当前state执行适当的方法,然后更新state

  2. # 2 楼答案

    使用Timer执行所需的一个或多个操作,如下面的MRE所示
    以下演示中的操作只是在^{中编写文本:

    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.Timer;
    
    public class SwingMain {
    
        private int phase = 1;
        private Timer moveTimer;
    
        SwingMain() {
            creategui();
        }
    
        void creategui(){
    
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.add(new APanel());
            f.pack();
            f.setVisible(true);
        }
    
        class APanel extends JPanel{
    
            private final JTextField tf;
            private final JButton start;
    
            APanel() {
                start = new JButton("Start");
                start.addActionListener(e-> startTimer());
                add(start);
                tf = new JTextField("Click Start",6);
                add(tf);
            }
    
            void startTimer() {
    
                start.setEnabled(false);
                ActionListener action = e -> autoPlay();
    
                moveTimer = new Timer(2000, action);
                moveTimer.setInitialDelay(500);
                moveTimer.start();
            }
    
            private void autoPlay() {
    
                switch (phase){
                    case 1:
                        phase++;
                        move1();
                        break;
                    case 2:
                        phase++;
                        move2();
                        break;
                    case 3:
                        phase++;
                        move3();
                        break;
                    default:
                        phase = 1;
                        moveTimer.stop();
                        tf.setText("Click Start");
                        start.setEnabled(true);
                        break;
                }
            }
    
            private void move1() {
                tf.setText("Move 1");
            }
    
            private void move2() {
                tf.setText("Move 2");
            }
    
            private void move3() {
                tf.setText("Move 3");
            }
        }
    
        public static void main(String[] args) {
            new SwingMain();
        }
    }