Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否可以将ActionListener添加到jFrame中的按钮,并将actionPerformed方法放在不同的类中?_Java_Swing_Oop_Event Handling_Actionlistener - Fatal编程技术网

Java 我是否可以将ActionListener添加到jFrame中的按钮,并将actionPerformed方法放在不同的类中?

Java 我是否可以将ActionListener添加到jFrame中的按钮,并将actionPerformed方法放在不同的类中?,java,swing,oop,event-handling,actionlistener,Java,Swing,Oop,Event Handling,Actionlistener,我有一个jFrame,用户在其中输入数据,还有一个控制器类,我想在其中将数据输入到一个新对象中。目前,我已经向jFrame中的按钮添加了一个侦听器,但无法让它识别控制器类中的actionPerformed方法 侦听器的“this”部分表示它正在泄漏到构造函数中,而类本身表示: “CreateAccountGUI不是抽象的,并且不重写操作侦听器中的抽象方法actionPerformed(actionEvent)” 我有其他按钮,但它们使用双击控件时提供的默认构造函数 以下是jFrame构造函数的代

我有一个jFrame,用户在其中输入数据,还有一个控制器类,我想在其中将数据输入到一个新对象中。目前,我已经向jFrame中的按钮添加了一个侦听器,但无法让它识别控制器类中的actionPerformed方法

侦听器的“this”部分表示它正在泄漏到构造函数中,而类本身表示:

“CreateAccountGUI不是抽象的,并且不重写操作侦听器中的抽象方法actionPerformed(actionEvent)”

我有其他按钮,但它们使用双击控件时提供的默认构造函数

以下是jFrame构造函数的代码:

public class CreateAccountGUI extends javax.swing.JFrame implements ActionListener{

/**
 * Creates new form CreateAccountGUI
 */
public CreateAccountGUI() {
    initComponents();
    cboAccountType.setVisible(false);
    lblAccountType.setVisible(false);
    btnCreateAccount.addActionListener(this);
} 
下面是我当前希望actionPerformed方法驻留的类中的代码:

public class AccountStrategyController implements ActionListener, Observer{

private CreateAccountGUI view = null;

public void setView(CreateAccountGUI view){
    this.view = view;
    view.setVisible(true);//Show the account creation form
}

@Override
public void actionPerformed(ActionEvent e) {

}
目前我在这门课上没有任何错误

我在网上看了一下,似乎你可以在不同的课程中添加监听器和操作,我只是不知道该怎么做


非常感谢您的帮助:)

我建议您: 1.首先,在使用MVC(模型-视图-控制器)结构时,必须区分文件。例如,您的第一个代码是从JFrame扩展而来的类。此类转到视图包,无法实现ActionListener。ActionListener用于控制器。要将JFrame类与控制器链接,必须在“CreateAccountGUI”中创建如下方法:

public void registerControllers(AccountStrategyController controller) {
    jButton.setActionCommand("JBUTTON");
    jButton.addActionListener(controller);
}
public static void main(String[] args) {
    // Elements de la interfície gràfica
    CreateAccountGUI gui = new CreateAccountGUI();
    AccountStrategyController asc = new AccountStrategyController();
    gui.registerControllers(asc);   
}
然后,在actionPerformed()方法中,必须编写以下内容:

public void actionPerformed(ActionEvent e) {
    switch(e.getActionCommand()) {
        case "JBUTTON":
            //Your code goes here
            break;
    }
}
为了实现这一点,在初始化GUI的主类中,必须编写如下内容:

public void registerControllers(AccountStrategyController controller) {
    jButton.setActionCommand("JBUTTON");
    jButton.addActionListener(controller);
}
public static void main(String[] args) {
    // Elements de la interfície gràfica
    CreateAccountGUI gui = new CreateAccountGUI();
    AccountStrategyController asc = new AccountStrategyController();
    gui.registerControllers(asc);   
}
希望它能帮助您

您可以做到:

public class CreateAccountGUI extends javax.swing.JFrame {

    public CreateAccountGUI() {
        /**/
        JButton btnCreateAccount = new JButton("Create");
        AccountStrategyController controller = new AccountStrategyController();
        controller.setView(this);
        btnCreateAccount.addActionListener(controller);
    }
}

class AccountStrategyController implements ActionListener{

    private CreateAccountGUI view = null;

    public void setView(CreateAccountGUI view){
        this.view = view;
        view.setVisible(true);//Show the account creation form
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //respond to button click 
    }
}
或者更好:

public class CreateAccountGUI extends javax.swing.JFrame {

    public CreateAccountGUI() {
        /**/
        JButton btnCreateAccount = new JButton("Create");
        AccountStrategyController controller = new AccountStrategyController();
        controller.setView(this);
        btnCreateAccount.addActionListener(controller.createAccountListener());
    }
}

class AccountStrategyController{

    private CreateAccountGUI view = null;

    public void setView(CreateAccountGUI view){
        this.view = view;
        view.setVisible(true);//Show the account creation form
    }

    public  ActionListener createAccountListener(){     
        return new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //respond to button click 
            }
        };
    }   
}
createAccountListener
可以使用lambdas编写:

public  ActionListener createAccountListener(){     
    return e -> {
        //respond to button click 
    };
}   

谢谢,我现在要试一试。