Java und GUI - Wohin gehören ActionListener nach MVC-Muster?

Ich schreibe gerade eine Java-Vorlagenanwendung und bin mir irgendwie nicht sicher, wo die ActionListener hingehören, wenn ich dem MVC-Muster sauber folgen wollte.

Das Beispiel basiert auf Swing, aber es geht nicht um das Framework, sondern um das Grundkonzept von MVC in Java, bei dem ein beliebiges Framework zum Erstellen der GUI verwendet wird.

Ich habe mit einer absolut einfachen Anwendung begonnen, die einen JFrame und einen JButton enthält (um den Frame zu entsorgen, schließen Sie die Anwendung). Der Code, der diesem Beitrag folgt. Nichts Besonderes, nur um zu verdeutlichen, wovon wir sprechen. Ich habe noch nicht mit dem Modell angefangen, da mich diese Frage zu sehr nervte.

Es gab bereits mehr als eine ähnliche Frage (n) wie diese:
MVC Muster mit vielen ActionListenern
Java Swing - Wohin soll der ActionListener gehen?

Aber keiner von ihnen war wirklich zufriedenstellend, da ich zwei Dinge wissen möchte:

Ist es sinnvoll, alle ActionListener in einem separaten Paket zu haben? Ich möchte dies aus Gründen der Lesbarkeit von View und Controller tun, insb. wenn es viele Zuhörer gibtWie kann ich eine Controller-Funktion in einem ActionListener ausführen, wenn der Listener keine Unterklasse innerhalb des Controllers ist? (Zusatzfrage

Ich hoffe, das ist nicht zu allgemein oder vage, ich frage hier, aber es lässt mich jetzt eine Weile nachdenken. Ich habe immer eine Art @ verwendmein eigener Weg, den ActionHandler über den Controller informieren, aber das scheint nicht richtig zu sein, also möchte ich endlich wissen, wie das richtig gemacht wird.

Mit freundlichen Grüßen
jaySon

Regler

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


Aussicht

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);
    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage