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

时间:2016-04-14 20:16:37

标签: java multithreading constructor chat actionlistener

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("");

当我这样做时,它告诉我我不能从JTextArea投射到服务器"

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

此时我不知道该怎么做。我确定它的东西很小,但我无法弄明白。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

我将首先在构造函数的情况下提供基于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);
    }
}

答案 1 :(得分:0)

你实际上没有在

交出任何字符串
  

eventsLog.appendEventsLog( “”);

如果它与您的问题有关,或者您只是忘了键入它,我不会感到害羞。