Java 为什么';鼠标垫没做什么吗?
我是Java新手,我正在尝试制作一个自动点击器。它是这样工作的。当您单击一个按钮时,应用程序开始单击(当您按下s时也会工作),当您按下“w”时,应用程序停止单击。我目前的主要问题是我无法让我的应用程序点击:V(我还有一个“main.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
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”定义了两次绑定
已经说过,您的代码仍然不正确,将来会给您带来问题:
击键
的最简单方法是将击键
绑定到框架的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”定义了两次绑定
已经说过,您的代码仍然不正确,将来会给您带来问题:
击键
的最简单方法是将击键
绑定到框架的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()
方法。不要在简单的测试中使用循环代码。在正确演示问题后,按下/释放之间的延迟可能需要更短。你只需要一个框架。但是,我建议你不要使用机器人,通常有更好的选择。好吧,忘掉我说的一切。我终于让机器人点击了,但键绑定仍然不起作用。当机器人开始点击时,没有任何一个键可以工作了。谢谢,我现在让它工作了。我根本无法让我的机器人点击。有什么建议吗?谢谢我现在开始工作了。我根本无法让我的机器人点击。有什么建议吗?