首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mousePress什么都不做?

为什么mousePress什么都不做?
EN

Stack Overflow用户
提问于 2020-09-01 05:16:26
回答 1查看 66关注 0票数 1

我对Java很陌生,我正在尝试做一个自动点击器。它是这样工作的。当您单击某个按钮时,应用程序开始单击(在您按s时也有效),当您按下"w“时,应用程序停止单击。我目前的主要问题是我无法使我的应用程序单击:V (我还有一个启动的"main.java“),下面是我的代码vvvvvvv

代码语言:javascript
复制
    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);
        
    }
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 17:02:51

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

你不给"V“键分配键绑定。您为"W“定义了两次绑定。

尽管如此,您的代码仍然是不正确的,并将在未来引起问题:

您要向BorderLayout.CENTER

  • components中添加两个组件的
  1. 应该在框架变为可见的
  2. 之前添加到框架中,您使用的是错误的InputMap

从您在上一个问题中提供给您的教程中,有3个InputMaps。只有当组件有焦点时,默认InputMap才能工作。在不正确的例子中,标签确实有焦点。但是,如果添加更多的组件,它很可能不会保留焦点。

在游戏中,确保游戏响应KeyStroke的最简单方法是将KeyStroke绑定到帧的JRootPaneInputMap。然后,不管框架上的哪个组件有焦点,动作都会被调用。

因此,您的代码应该如下所示:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63681759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档