如何链接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();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...