Java 为什么';鼠标垫没做什么吗?

Java 为什么';鼠标垫没做什么吗?,java,swing,jframe,key-bindings,Java,Swing,Jframe,Key Bindings,我是Java新手,我正在尝试制作一个自动点击器。它是这样工作的。当您单击一个按钮时,应用程序开始单击(当您按下s时也会工作),当您按下“w”时,应用程序停止单击。我目前的主要问题是我无法让我的应用程序点击:V(我还有一个“main.java”用于启动),这是我的代码 package copy; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.KeyAdapt

我是Java新手,我正在尝试制作一个自动点击器。它是这样工作的。当您单击一个按钮时,应用程序开始单击(当您按下s时也会工作),当您按下“w”时,应用程序停止单击。我目前的主要问题是我无法让我的应用程序点击:V(我还有一个“main.java”用于启动),这是我的代码

    package copy;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyAdapter;





import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Game 
implements ActionListener{

    JFrame frame;
    JLabel label;
    JButton button;
    Action ON;
    Action OFF;
    private static Robot bot;
    public static boolean status = false;
    
    Game(){
        ON = new statusON();
        OFF = new statusOFF();
        
        frame = new JFrame("Bullet Chicken Clicker");
        label = new JLabel();
        button = new JButton("turn on?");
        frame.setSize(400, 400);
        frame.setLocation(600, 150);
        frame.setVisible(true); 
        frame.setAlwaysOnTop(true);
        frame.add(label);
        frame.add(button); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        label.getInputMap().put(KeyStroke.getKeyStroke('w'), "OFF");
        label.getActionMap().put("OFF", OFF);
        
        

        
        label.getInputMap().put(KeyStroke.getKeyStroke('w'), "upAction");
        label.getActionMap().put("upAction", ON);
        label.getInputMap().put(KeyStroke.getKeyStroke('s'), "downAction");
        label.getActionMap().put("downAction", OFF);
        
        button.setPreferredSize(new Dimension(40, 40));
        button.setOpaque(true);
        button.setForeground(Color.BLACK);   
        button.setBounds(125, 150, 150, 30);
        button.setVisible(true);
        button.addActionListener(this);
        button.setFocusable(false);
    }
    
    private void clicky() {
        while (status == true);
            bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            bot.delay(300);
            bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            bot.delay(300);
    }
    public static void robot() {
        try {
            bot = new Robot();
        } catch (AWTException e2) {
            e2.printStackTrace();
        }
    }
    
    public class statusON extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            status = true;
            System.out.print(status);
        }       
    }
    public class statusOFF extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            status = false;
            System.out.print(status);
        }       
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        status = true;
        System.out.print(status);
        
    }
    
}
我目前的主要问题是我无法让我的应用程序点击:V

嗯,您不需要为“V”键分配键绑定。您为“W”定义了两次绑定

已经说过,您的代码仍然不正确,将来会给您带来问题:

  • 您正在向BorderLayout.CENTER添加两个组件
  • 在使框架可见之前,应将构件添加到框架中
  • 您使用了错误的InputMap
  • 从上一个问题中提供给您的教程中,有3个InputMaps。默认的InputMap仅在组件具有焦点时才起作用。在您不正确的示例中,恰好标签有焦点。但是,如果您添加更多的组件,它可能无法保持焦点

    在游戏中,确保游戏响应
    击键
    的最简单方法是将
    击键
    绑定到框架的
    JRootPane
    InputMap
    。然后,不管帧上哪个组件具有焦点,都将调用该操作

    因此,您的代码应该类似于:

    JRootPane rootPane = frame.getRootPane();
    InputMap im = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    im.put(KeyStroke.getKeyStroke('v'), "OFF");
    rootPane.getActionMap().put("OFF", OFF);
    im.put(KeyStroke.getKeyStroke('w'), "upAction");
    rootPane.getActionMap().put("upAction", ON);
    im.put(KeyStroke.getKeyStroke('s'), "downAction");
    rootPane.getActionMap().put("downAction", OFF);
    
    不需要JLabel

    我目前的主要问题是我无法让我的应用程序点击:V

    嗯,您不需要为“V”键分配键绑定。您为“W”定义了两次绑定

    已经说过,您的代码仍然不正确,将来会给您带来问题:

  • 您正在向BorderLayout.CENTER添加两个组件
  • 在使框架可见之前,应将构件添加到框架中
  • 您使用了错误的InputMap
  • 从上一个问题中提供给您的教程中,有3个InputMaps。默认的InputMap仅在组件具有焦点时才起作用。在您不正确的示例中,恰好标签有焦点。但是,如果您添加更多的组件,它可能无法保持焦点

    在游戏中,确保游戏响应
    击键
    的最简单方法是将
    击键
    绑定到框架的
    JRootPane
    InputMap
    。然后,不管帧上哪个组件具有焦点,都将调用该操作

    因此,您的代码应该类似于:

    JRootPane rootPane = frame.getRootPane();
    InputMap im = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    im.put(KeyStroke.getKeyStroke('v'), "OFF");
    rootPane.getActionMap().put("OFF", OFF);
    im.put(KeyStroke.getKeyStroke('w'), "upAction");
    rootPane.getActionMap().put("upAction", ON);
    im.put(KeyStroke.getKeyStroke('s'), "downAction");
    rootPane.getActionMap().put("downAction", OFF);
    

    没有必要使用JLabel。

    请不要转寄问题。堆栈溢出是一个问答网站,而不是留言板。重新发布只会让网站变得混乱,这实际上让你和其他人更难找到答案。你要么删除旧问题,要么删除这个问题,因为它们在本质上是相同的。好吧,如果你想让Swing开发人员注意到你的问题,我会尽量不包含“Swing”标记。我根本无法让我的机器人点击。有什么建议吗我不知道你期望发生什么。如果希望机器人单击框架上的组件,则需要将机器人的位置设置为框架上组件的位置。我认为您可以使用
    getLocationOnScreen()
    方法。不要在简单的测试中使用循环代码。在正确演示问题后,按下/释放之间的延迟可能需要更短。你只需要一个框架。但是,我建议你不要使用机器人,通常有更好的选择。好吧,忘掉我说的一切。我终于让机器人点击了,但键绑定仍然不起作用。当机器人开始点击时,非键绑定不再工作。请不要转发问题。堆栈溢出是一个问答网站,而不是留言板。重新发布只会让网站变得混乱,这实际上让你和其他人更难找到答案。你要么删除旧问题,要么删除这个问题,因为它们在本质上是相同的。好吧,如果你想让Swing开发人员注意到你的问题,我会尽量不包含“Swing”标记。我根本无法让我的机器人点击。有什么建议吗我不知道你期望发生什么。如果希望机器人单击框架上的组件,则需要将机器人的位置设置为框架上组件的位置。我认为您可以使用
    getLocationOnScreen()
    方法。不要在简单的测试中使用循环代码。在正确演示问题后,按下/释放之间的延迟可能需要更短。你只需要一个框架。但是,我建议你不要使用机器人,通常有更好的选择。好吧,忘掉我说的一切。我终于让机器人点击了,但键绑定仍然不起作用。当机器人开始点击时,没有任何一个键可以工作了。谢谢,我现在让它工作了。我根本无法让我的机器人点击。有什么建议吗?谢谢我现在开始工作了。我根本无法让我的机器人点击。有什么建议吗?