【问题标题】:Why doesn't mousePress do anything?为什么mousePress不做任何事情?
【发布时间】:2020-09-01 05:16:26
【问题描述】:

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

    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);
        
    }
    
}

【问题讨论】:

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

标签: java swing jframe key-bindings


【解决方案1】:

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

好吧,您没有为“V”键分配键绑定。您为“W”定义了两次绑定。

话虽如此,您的代码仍然不正确,将来会给您带来问题:

  1. 您正在向 BorderLayout.CENTER 添加两个组件
  2. 组件应在框架可见之前添加到框架中
  3. 您使用了错误的 InputMap

在上一个问题中提供给您的教程中,有 3 个 InputMap。默认的 InputMap 仅在组件具有焦点时才起作用。在您的错误示例中,标签确实具有焦点。但是,如果您添加更多组件,它可能不会保留焦点。

就游戏而言,确保游戏响应KeyStroke 的最简单方法是将KeyStroke 绑定到框架的JRootPane 的InputMap。那么无论frame上哪个组件有焦点,都会调用Action。

所以你的代码应该是这样的:

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。

【讨论】:

  • 感谢我现在可以使用它。我根本无法让我的机器人点击。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-12-20
  • 2011-07-25
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多