gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:51:51 25 4
gpt4 key购买 nike

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

一般的代码是这样的。当我运行代码时,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com