java GUI 的新手,我有问题

New to java GUI and i have questions

我正在为我在 twitch 上的朋友制作一个机器人,他忘记在 xsplit 上从他的 "brb" 场景切换到他的 "game" 场景,所以他想制作一些 mods如果他忘记了,可以更改或控制他计算机上的某些东西。为此制作一个机器人很容易。

代码很容易制作,就是这样。

import java.awt.Robot;
import java.awt.event.KeyEvent;

import org.jibble.pircbot.*;

public class Twitchbot extends PircBot {

    public Twitchbot() {
        this.setName("Rex__Bot");
    }


    public void onMessage(String channel, String sender, String login, String hostname, String message) {

        if(message.equals("Something")) {
            try {
                Robot r = new Robot();
                r.keyPress(KeyEvent.VK_Something);
                r.delay(300);
                r.keyRelease(KeyEvent.VK_Something);

            }catch(Exception ex) {
                ex.printStackTrace();
            }
        }

   }
}

我想知道是否有办法制作一个 GUI 来将消息等于的字母和 keyevent.VK_Something 更改为与 GUI 不同的东西,这样他就可以很容易地编辑它.

因此,首先,您需要一些方法来捕获所需的信息。基本上,您需要消息和击键。击键由虚拟键和修饰符组成。

下面的示例基本上提供了一种用户可以键入消息文本和击键的方法。捕获窗格使用 KeyListener 来监视键事件并通过从键事件中提取各种值,将存储它需要的信息并向用户显示键字符。

您可以将此信息保存到 Properties 文件中,稍后您可以加载...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;

public class Test {

    public static void main(String[] args) {
        new Test ();
    }

    public Test () {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ConfigurationPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ConfigurationPane extends JPanel {

        private KeyPressPane keyPressPane;
        private JTextField name;

        public ConfigurationPane() {

            name = new JTextField(10);
            keyPressPane = new KeyPressPane();

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            add(name, gbc);
            add(keyPressPane, gbc);

            JButton save = new JButton("Save");
            save.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Properties p = new Properties();
                    p.setProperty("name", name.getText());
                    p.setProperty("keyCode", Integer.toString(keyPressPane.getKeyCode()));
                    p.setProperty("modifiers", Integer.toString(keyPressPane.getModifiers()));

                    try (OutputStream os = new FileOutputStream(new File("Config.cfg"))) {
                        p.store(os, "Key config");
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            add(save);

        }

    }

    public static class KeyPressPane extends JPanel {

        protected static final Border FOCUSED_BORDER = BorderFactory.createLineBorder(UIManager.getColor("List.selectionBackground"));
        protected static final Border UNFOCUSED_BORDER = UIManager.getBorder("TextField.border");

        private JLabel label;

        private int keyCode;
        private int modifiers;
        private char key;

        public KeyPressPane() {

            setBackground(UIManager.getColor("TextField.background"));
            setLayout(new GridBagLayout());
            label = new JLabel(" ");
            label.setFont(UIManager.getFont("Label.font").deriveFont(48f));
            add(label);
            addKeyListener(new KeyAdapter() {

                @Override
                public void keyPressed(KeyEvent e) {
                    keyCode = e.getKeyCode();
                    modifiers = e.getModifiers();
                }

                @Override
                public void keyTyped(KeyEvent e) {
                    char key = e.getKeyChar();
                    label.setText(Character.toString(key));
                }
            });
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    requestFocusInWindow();
                }
            });
            addFocusListener(new FocusListener() {

                @Override
                public void focusGained(FocusEvent e) {
                    setBorder(FOCUSED_BORDER);
                }

                @Override
                public void focusLost(FocusEvent e) {
                    System.out.println("unfocused");
                    setBorder(UNFOCUSED_BORDER);
                }
            });
            setBorder(UNFOCUSED_BORDER);
            setFocusable(true);
        }

        public int getKeyCode() {
            return keyCode;
        }

        public int getModifiers() {
            return modifiers;
        }

    }

}

然后您需要加载 Properties 文件并创建一个新的 KeyStroke...

Properties p = new Properties();
try (InputStream is = new FileInputStream(new File("Config.cfg"))) {
    p.load(is);

    String name = p.getProperty("name");
    int keyCode = Integer.parseInt(p.getProperty("keyCode"));
    int modifiers = Integer.parseInt(p.getProperty("modifiers"));

    KeyStroke ks = KeyStroke.getKeyStroke(keyCode, modifiers);
    System.out.println(ks);

} catch (IOException exp) {
    exp.printStackTrace();
}