Java und GUI - Wo ActionListeners gehören nach MVC-Muster?

Schreibe ich momentan eine Vorlage Java-Applikation und irgendwie bin ich mir nicht sicher, wo die ActionListeners gehören, wenn ich wollte, sauber zu Folgen dem MVC-pattern.

Beispiel ist Swing-basiert, aber es geht nicht um den Rahmen sondern das grundlegende Konzept von MVC in Java unter Verwendung von framework zu erstellen GUI.

Begann ich mit einem absolut einfache Anwendung mit einem JFrame und JButton (entsorgen Sie den Rahmen, damit die Anwendung zu schließen). Der nachfolgende code in diesem post. Nichts wirklich besonderes, nur zu clearify, wovon wir reden. Ich habe nicht mit dem Modell noch nicht, da diese Frage wurde nervt mich zu viel.

Es wurde bereits mehr als eine ähnliche Frage(N), wie diese:

MVC-Muster mit vielen ActionListeners

Java-swing - Wo sollte der ActionListener gehen?

Aber nicht von Ihnen war wirklich zufriedenstellend, da würde ich gerne zwei Dinge wissen:

  • Ist es sinnvoll, alle ActionListeners in einem separaten Paket?
    • Ich würde gerne so im Interesse der Lesbarkeit von View und Controller, esp. wenn es gibt eine Menge Zuhörer
  • Wie würde ich das ausführen eines Controller-Funktion aus einem ActionListener, wenn der Hörer ist nicht eine sub-Klasse in den Controller? (follow-up-Frage)

Ich hoffe das ist nicht zu allgemein oder vage Frage ich ja hier, aber es macht mich denken, für eine Weile jetzt. Früher habe ich immer Art von meinen eigenen Weg, lassen Sie den ActionHandler wissen über die Controller -, aber das scheint nicht richtig zu sein, also ich würde schließlich gerne wissen, wie diese richtig gemacht wird.

Freundlichen GRÜßEN,

jaySon


Controller:

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


Ansicht:

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);
    }
}
  • Sie gehören zu der view-Schicht. Keine action listener definiert werden, die außerhalb der Ansichten.
  • Das ist allerdings merkwürdig, da nach meinem Verständnis ein action-listener rufen soll, die Controller-Funktionen, wie der Blick sollte nicht irgendwelche "Funktionen" als eine Service-Klasse haben könnte.
  • Aber der controller sollte KEINE UI-Logik entweder 😉
InformationsquelleAutor jaySon | 2014-10-22
Schreibe einen Kommentar