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