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

标签 java while-loop jbutton actionevent

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

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

我目前正在考虑使用 boolean 值 (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 表示 TaskEx 对象的“状态”,您的处理程序的响应将取决于此变量的状态。

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();
            }
        }
    }

}

关于java - 有没有办法在按下按钮之前停止方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167176/

相关文章:

Java Swing - JButton 模型中的 isRollover() 值

java - 为什么我的 Swing 应用程序卡住了?

java - 如何以编程方式发现 Spring Boot 使用的 JPA 实现和 SQL 方言?

java - 为什么for语句后面加分号会导致编译错误?

java - 比较 float 错误

JavaScript : setInterval in a while?

python - Python-Ply分析器: How can I stop the parsing wherever I want?

java - 是否值得测试 json 响应的值

java - "Invalid Response"再次选择怎么说? ( java 语)

java - 如何检查 JButton 中是否有文本