为什么 mousePress 什么都不做?
Why doesn't mousePress do anything?
我是 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);
}
}
My main issue currently is I can't manage to make my application click :V.
好吧,您没有为“V”键分配键绑定。您为“W”定义了两次绑定。
话虽如此,您的代码仍然不正确,将来会给您带来麻烦:
- 您正在向 BorderLayout.CENTER
添加两个组件
- 应在框架可见之前将组件添加到框架中
- 您使用了错误的 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。
我是 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);
}
}
My main issue currently is I can't manage to make my application click :V.
好吧,您没有为“V”键分配键绑定。您为“W”定义了两次绑定。
话虽如此,您的代码仍然不正确,将来会给您带来麻烦:
- 您正在向 BorderLayout.CENTER 添加两个组件
- 应在框架可见之前将组件添加到框架中
- 您使用了错误的 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。