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

时间:2016-02-03 01:57:06

标签: java while-loop jbutton actionevent

我一直在为纸牌游戏编码而无法让我的方法等待按下按钮。

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

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

任何帮助将不胜感激。 谢谢。

int

1 个答案:

答案 0 :(得分:3)

你的是一个经典的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();
            }
        }
    }

}