В настоящее время я пишу шаблонное приложение Java, и каким-то образом я не уверен, где находятся ActionListeners, если я хочу чисто следовать шаблону MVC.
В примере используется Swing, но это не о структуре, а скорее о базовой концепции MVC в Java, используя любую среду для создания графического интерфейса.
Я начал с абсолютно простого приложения, содержащего JFrame и JButton (чтобы избавиться от фрейма, следовательно, закрыть приложение). Код, завершающий этот пост. Ничего особенного, просто чтобы понять, о чем мы говорим. Я не начинал с Модели, так как этот вопрос слишком сильно исказил меня.
Уже было несколько подобных вопросов, например:
Шаблон MVC со многими ActionListeners
Java swing - Куда должен проходить ActionListener?
Но они не были действительно удовлетворительными, поскольку я хотел бы знать две вещи:
- Можно ли использовать все ActionListeners в отдельном пакете?
- Я хотел бы сделать это ради удобочитаемости View и Controller, esp. если там много слушателей
- Как я могу выполнить функцию Controller из ActionListener, если слушатель не является подклассом внутри контроллера? (последующий вопрос)
Надеюсь, это не слишком общий или неопределенный вопрос, который я задаю здесь, но это заставляет меня думать некоторое время. Я всегда использовал свой свой собственный путь, позволяя ActionHandler знать о контроллере, но это не кажется правильным, поэтому я, наконец, хотел бы знать, как это делается правильно.
С уважением,
Джейсон
Контроллер:
package controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import view.MainView;
public class MainController
{
MainView mainView = new MainView();
public MainController()
{
this.initViewActionListeners();
}
private void initViewActionListeners()
{
mainView.initButtons(new CloseListener());
}
public class CloseListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
mainView.dispose();
}
}
}
Вид:
package view;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainView extends JFrame
{
JButton button_close = new JButton();
JPanel panel_mainPanel = new JPanel();
private static final long serialVersionUID = 5791734712409634055L;
public MainView()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setSize(500, 500);
this.add(panel_mainPanel);
setVisible(true);
}
public void initButtons(ActionListener actionListener)
{
this.button_close = new JButton("Close");
this.button_close.setSize(new Dimension(100, 20));
this.button_close.addActionListener(actionListener);
this.panel_mainPanel.add(button_close);
}
}