java JButton ActionListener未启动TimerTask
我正在为我玩的游戏制作一个机器人,并制作了一个GUI,这样机器人的用户就可以控制机器人何时处于活动状态。为此,我制作了一个启动/停止按钮,将变量设置为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();
}
}
}
另外,我在马科斯莫哈韦。我不知道这是否重要,但显然有些JFrame功能在Mac上无法正常工作。请告诉我,我是否正在尝试实施其中一项。此外,我正在使用java。awt和机器人对象来模拟按键
# 1 楼答案
你有两个主要问题,第一个是:
由于
start
是一个JButton,isSelected()
永远不会是真的,如果你想要这种类型的功能,你应该使用JToggleButton或JCheckBox或JRadioButton(后两个从JToggleButton扩展而来),并在按下时更改所选状态所以
另一个选项是创建自己的布尔字段来切换和测试按钮按下,但是你不会从按钮得到关于其状态的视觉反馈。我想你也可以使用按钮文本的状态,通过
getText()
获得另一个问题是使用
java.util.Timer
和java.util.TimerTask
,因为这会创建可能不安全的代码。在为Swing GUI创建计时器时,几乎总是最好使用javax.swing.Timer
或“Swing Timer”,因为计时器的ActionListener中的代码保证在Swing事件线程上被调用