有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你有两个主要问题,第一个是:

    if (start.isSelected()) {
    

    由于start是一个JButton,isSelected()永远不会是真的,如果你想要这种类型的功能,你应该使用JToggleButton或JCheckBox或JRadioButton(后两个从JToggleButton扩展而来),并在按下时更改所选状态

    所以

    JToggleButton start = new JToggleButton("START");
    

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

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