gpt4 book ai didi

java - JButton ActionListener 未启动 TimerTask

转载 作者:行者123 更新时间:2023-12-02 10:09:47 24 4
gpt4 key购买 nike

我正在为我玩的游戏制作一个机器人,并制作了一个 GUI,以便机器人的用户可以控制机器人何时处于 Activity 状态。为此,我制作了一个启动/停止按钮,将变量设置为 true。每个攻击都是一个不同的类,并且它们扩展了 TimerTask 类。它们所拥有的只是 TimerTask 所具有的 run() 方法的实现,并且它们只是执行

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_1); //the ".VK_1" part will be different per class
robot.keyRelease(KeyEvent.VK_1);

理想情况下,用户按下按钮,TimerTasks 将运行,模拟游戏中的攻击按键。但是,按钮上的文本不会更改,并且 TimerTasks 永远不会运行。有人有解决方案吗?我的代码如下。提前致谢!

主类:

package AQWGrindBot;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;

public class Main {

private static boolean playing = false;
static Timer timer = new Timer();

public static void main(String[] args) {
int speed = 1000;
final boolean[] startVar = {false};

JFrame frame = new JFrame("AQW Attack Bot");


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,100);
frame.setResizable(false);
frame.setExtendedState(Frame.MAXIMIZED_BOTH);

JButton start = new JButton("START");
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (start.isSelected()) {
playing = !playing;
if (start.getText().equals("START")) {
start.setText("STOP");
toggleBot(true);
} else {
start.setText("START");
toggleBot(false);
}
}
}
});

frame.setLayout(new FlowLayout());
frame.add(start);
frame.setVisible(true);
}

private static void toggleBot(boolean check) {
if (check) {
timer.schedule(new AQWBotATK1(), 0, 1000);
timer.schedule(new AQWBotATK3(), 0, 3000);
timer.schedule(new AQWBotATK4(), 0, 17000);
} else {
timer.cancel();
}
}
}

P.S 我使用的是 macOS Mojave。我不知道这是否重要,但显然有些 JFrame 功能在 Mac 上无法正常工作。请告诉我我是否正在尝试实现其中之一。另外,我使用 java.awt 和 Robot 对象来模拟按键。

最佳答案

您有两个主要问题,第一个在这里:

if (start.isSelected()) {

start是一个 JButton,isSelected()永远不会是这样,如果您想要这种类型的功能,您应该使用 JToggleButton 或 JCheckBox 或 JRadioButton (后两者从 JToggleButton 扩展)并在按下时更改选定状态。

所以,

JToggleButton start = new JToggleButton("START");

另一个选项是创建您自己的 boolean 字段来切换并测试按钮按下情况,但您不会从按钮获得有关其状态的视觉反馈。我想你也可以使用按钮文本的状态,通过 getText() 获得

您的另一个问题是您使用 java.util.Timerjava.util.TimerTask因为这会创建可能不是 Swing 线程安全的代码。使用 javax.swing.Timer 几乎总是更好或在为 Swing GUI 创建计时器时使用“Swing 计时器”,因为保证在 Swing 事件线程上调用计时器的 ActionListener 中的代码。

关于java - JButton ActionListener 未启动 TimerTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55081456/

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