Могу ли я добавить ActionListener для кнопки в jFrame и иметь метод actionPerformed в другом классе? - PullRequest
0 голосов
/ 12 января 2019

У меня есть 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) {

}

В данный момент у меня нет ошибок в этом классе.

Я посмотрел онлайн, и кажется, что у вас может быть добавленный слушатель и actionPerform в разных классах, я просто не могу обойти его.

Любая помощь очень ценится:)

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете сделать:

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 можно записать с помощью лямбды:

public  ActionListener createAccountListener(){     
    return e -> {
        //respond to button click 
    };
}   
0 голосов
/ 12 января 2019

Я бы порекомендовал сделать это: 1. Прежде всего, поскольку вы работаете со структурой MVC (модель-представление-контроллер), вы должны различать файлы. Например, ваш первый код - это класс, который происходит от JFrame. Этот класс идет в пакет представления и не может реализовать ActionListener. ActionListener для контроллеров. Чтобы связать класс JFrame с контроллерами, вам нужно создать метод в CreateAccountGUI следующим образом:

public void registerControllers(AccountStrategyController controller) {
    jButton.setActionCommand("JBUTTON");
    jButton.addActionListener(controller);
}

Затем в методе actionPerformed () вы должны написать это:

public void actionPerformed(ActionEvent e) {
    switch(e.getActionCommand()) {
        case "JBUTTON":
            //Your code goes here
            break;
    }
}

И чтобы это работало, в классе Main, где вы запускаете графический интерфейс, вы должны написать что-то вроде этого:

public static void main(String[] args) {
    // Elements de la interfície gràfica
    CreateAccountGUI gui = new CreateAccountGUI();
    AccountStrategyController asc = new AccountStrategyController();
    gui.registerControllers(asc);   
}

Надеюсь, это поможет вам

...