Java: 我不能把我的 actionlistener 放在构造函数之外

Java: I can't put my actionlistener outside the constructor

public Server(){
 start.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {
            try{    
                port = Integer.parseInt(portInput.getText());
            }
            catch(NumberFormatException e){
                text.append("");
            }

        }

 });


}

在构造函数中有 actionlistener,我不能使用 append 方法,因为它告诉我添加一个服务器转换到 text.append("");

当我这样做时,它告诉我我 "Cannot cast from JTextArea to Server"

当我将动作侦听器移到构造函数之外时,它给我一个错误,基本上迫使我将动作侦听器放在构造函数中。所以我想要的是能够在构造函数之外拥有动作侦听器,这样我就可以在动作侦听器中调用 append 方法。

此时我不确定该怎么做。我敢肯定这是小事,但我就是想不通。有什么帮助吗?

你实际上并没有在

交出任何字符串

eventsLog.appendEventsLog("");

我不确定这是否与您的问题有关,或者您只是忘记输入了。

我将首先展示基于构造函数案例中的 addActionListener 的工作代码,我冒昧地介绍了缺少的字段。

public class ServerGUI {

    private final JButton startServer = new JButton("Start server");
    int port;
    private JTextField portInput = new JTextField();
    private JTextArea eventsLog = new JTextArea();

    public ServerGUI(){
        startServer.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    port = Integer.parseInt(portInput.getText());
                }
                catch(NumberFormatException nfe){
                    appendEventsLog("");
                }
            }
        });
    }

    private void appendEventsLog(String msg) {
        String text = eventsLog.getText();
        eventsLog.setText(text + "\n" + msg);
    }
}

这里的问题是 appendEventsLog 不是 JTextArea 的成员,而是 ServerGUI 的成员。

对于第二种情况,在构造函数之外将 ActionListener 分配给 JButton,您必须使用静态代码块或我更喜欢的初始化方法

public class ServerGUI {

    private final JButton startServer = new JButton("Start server");
    int port;
    private JTextField portInput = new JTextField();
    private JTextArea eventsLog = new JTextArea();

    public ServerGUI(){
        initalise();
    }

    private void initalise() {
        startServer.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    port = Integer.parseInt(portInput.getText());
                }
                catch(NumberFormatException nfe){
                    appendEventsLog("");
                }
            }
        });
    }

    private void appendEventsLog(String msg) {
        String text = eventsLog.getText();
        eventsLog.setText(text + "\n" + msg);
    }
}