我一直在为纸牌游戏编码而无法让我的方法等待按下按钮。
一般代码是这样的。当我运行代码时, doTask()有一段需要等待按下按钮的段。但是,该方法不会等待按钮,只是循环。
我目前正在考虑使用带有布尔值(buttonIsPressed)的while循环,它将在 actionPerformed(e)中触发为true。但是,有更简单的方法吗?
任何帮助将不胜感激。 谢谢。
int
答案 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();
}
}
}
}