如何链接ActionListener以便在全局范围内进行监听?

问题描述

我正在尝试制作一个简单的基于控制台的Swing GUI,将订单和响应分开。我想要做的是制作顺序对话式控制台。例如,将要求玩家键入“游戏”以开始,然后键入玩家的名称以保存并继续。我成功制作了控制台,但不知道如何将用户键入信息链接到动作侦听器。

我所做的如下。

public class ConsolePane extends JPanel {

    private final JTextField textField = new JTextField(20);
    private final JTextArea textAreaOrder = new JTextArea(20,30);
    private ActionListener listener;
    private JButton button;

    public ConsolePane(ActionListener listener) {
        this.listener = listener;
    }

    public JComponent display() {
        textAreaOrder.setText("Game or Exit");
        try {
            OutputStream os = new StreamWriter(textAreaOrder);
            System.setout(new PrintStream(os,true,"UTF-8"));
        } catch (IOException ex) {
            ex.printstacktrace();
        }
        Box Box = Box.createHorizontalBox();
        Box.setBorder(BorderFactory.createEmptyBorder(5,5,5));
        Box.add(Box.createHorizontalglue());
        Box.add(textField);
        Box.add(Box.createHorizontalStrut(5));
        button = new JButton("Enter");
        button.setActionCommand("Enter");
        button.addActionListener(listener);
        Box.add(button);
        textAreaOrder.setEditable(false);

        JPanel p = new JPanel(new BorderLayout());
        p.add(new JScrollPane(textAreaOrder));
        p.add(Box,BorderLayout.soUTH);
        return p;
    }
}

public class Controller implements ActionListener {

    private JFrame frame;
    private JTextField textField;
    private JTextArea textAreaOrder;
    private MainController mc;
    private SetUpController suc;
    private GameController gc;
    private LoadFileUtil fu;
    private ActionListener listener;

    public Controller() {
//        ProcExec instance = new ProcExec(this);
//        EventQueue.invokelater(instance);
        EventQueue.invokelater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | illegalaccessexception | UnsupportedLookAndFeelException ex) {
                }
                createFrame();
            }
        });
    }

    public void run() {
        mc = new MainController(frame,this);
        suc = new SetUpController(frame,this);
        gc = new GameController(frame,this);
        suc.start();
    }

    public void createFrame() {
        JFrame frame = new JFrame("Hannah's Mafia Game");
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new ConsolePane(listener).display());
        frame.pack();
        frame.setLocationRelativeto(null);
        frame.setVisible(true);
        frame.setLocationRelativeto(null);
    }

   
    @Override
    public void actionPerformed(ActionEvent e) {
        String name = textField.getText();
        switch(name) {
            case "game":
                textAreaOrder.setText("Type players");
                //instance.run();
                break;
            case "exit":
                textAreaOrder.setText("Game Done");
                //instance.run();
                break;
        }
    }

}````

解决方法

我已经检查了您的代码,并且您的textfield存在ConsolePane类和Controller类->它们是不同的。在get()类中创建一个ConsolePane方法,以获取输入到此JTextField的文本。

尝试在ConsolePane中使用此方法:

public String getJTextField(){
    return textField.getText();
}

然后替换:

String name = textField.getText(); -----> String name = getJTextField();