有没有办法在按下按钮之前停止方法?

Is there a way to halt a method until a button is pressed?

我一直在为纸牌游戏编写代码,但无法获得等待按下按钮的方法。

一般的代码是这样的。当我 运行 代码时,doTask() 有一段需要等待按下按钮。但是,该方法不等待按钮,只是循环。

我目前正在考虑使用一个 布尔值 (buttonIsPressed) 的 while 循环,它将在 actionPerformed(e) 中触发为真.但是,有更简单的方法吗?

如有任何帮助,我们将不胜感激。 谢谢。

public class Test {

    public Test()
    {   
        // all vars instantiated

        while (!(taskLeft==0))
        {
            doTask();
            taskLeft--;
        }

    }

    private class Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent arg0) {

            // update information in doTask()

        }

    }

}

您的问题很经典 XY Problem,您在其中询问如何解决特定代码问题,而最佳解决方案是使用完全不同的方法。您正在考虑如何编写此事件驱动的 GUI 程序以使其作为线性控制台程序工作,而这不是您应该采用的方法。取而代之的是查看更改对象状态和基于对象的状态对事件的响应。

因此摆脱 while 循环,而是在按下按钮时根据 GUI 的状态执行任务。任何解决方案的细节都将取决于您的问题的细节,您可能希望与我们分享一些内容。

例如,这里的 taskLeft 代表一个 "state" 的 TaskEx 对象,你的 Handler 的响应将取决于这个变量的状态。

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

import javax.swing.*;

public class TaskEx extends JPanel {
    private int taskLeft = 10;

    public void doTask() {
        // 
    }

    private class Handler implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (taskLeft > 0) {
                doTask();
                taskLeft--;
            }
        }
    }
}

一个实际运行的例子:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class TaskEx extends JPanel {
    private int taskLeft = 10;
    private JLabel taskCountLabel = new JLabel(String.valueOf(taskLeft));

    public TaskEx() {
        JPanel northPanel = new JPanel();
        northPanel.add(new JLabel("Tasks Left:"));
        northPanel.add(taskCountLabel);

        JPanel centerPanel = new JPanel();
        centerPanel.add(new JButton(new Handler("Push Me")));

        setLayout(new BorderLayout());
        add(northPanel, BorderLayout.PAGE_START);
        add(centerPanel, BorderLayout.CENTER);
    }

    public void doTask() {
        taskCountLabel.setText(String.valueOf(taskLeft));
    }

    private static void createAndShowGui() {
        TaskEx mainPanel = new TaskEx();

        JFrame frame = new JFrame("Task Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

    private class Handler extends AbstractAction {
        public Handler(String name) {
            super(name);
            putValue(MNEMONIC_KEY, (int) name.charAt(0));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (taskLeft > 0) {
                taskLeft--;
                doTask();
            }
        }
    }

}