有没有办法在按下按钮之前停止方法?
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();
}
}
}
}
我一直在为纸牌游戏编写代码,但无法获得等待按下按钮的方法。
一般的代码是这样的。当我 运行 代码时,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();
}
}
}
}