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 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie im Zusammenhang mit der Kontrolle, aber Sie müssen nicht ein direkter Teil der Kontrolle. Zum Beispiel, finden Sie den code unten geschrieben, dass ich bei der Vorbereitung eine andere Frage-eine, die über anonyme innere Klassen-und Kupplung, hier gebe ich alle meine Knöpfe anonymen inneren Aktionen (die ActionListeners, natürlich), und verwenden Sie dann die Aktionen zum ändern des GUI-Status. Listener in die GUI (Kontrolle) werden mit dieser änderung in Kenntnis gesetzt, und kann dann entsprechend handeln.
Hinweis in der Warnung, obwohl: ich bin kein professioneller Programmierer oder sogar eine Universität ausgebildete coder, so nehmen Sie bitte dies nur als meine Meinung nur.
Action
s ist ein Anfang, aber Sie neigen dazu, sich auf die Ansicht Seite. Eine Möglichkeit könnte sein, zu beschreiben, was die Ansicht bestimmt ist, zu tun und für die Gestaltung einesinterface
um ihn herum. Es gibt keinen Grund, warum ein view kann nicht enthalten, die anderen MVCs und ein Modell könnte-feed-Informationen zu einem anderen Modell beeinflussen könnten dazugehörigen controller und so weiter und so Fort. Die zentrale Frage, nochmals, Swing ist nicht ein reines MVC, so ist es wie der Versuch, squeeze einen Elefanten in einem mini-boot, sicher, es könnte möglich sein, aber es ist nicht hübsch zu seinEinen Lerne zurzeit Java in der Schule. Der Lehrer erzählte uns, dass die Zuhörer immer deklariert werden müssen innerhalb der Controller Klasse. Die Art, wie ich es mache, ist, eine Methode zu implementieren, z.B. Listener(). Im inneren sind alle listener-Deklarationen Verwendung von anonymen Klassen. Das ist die Art, wie mein Lehrer es wollen, um zu sehen, aber ehrlich gesagt, ich bin mir nicht wirklich sicher, ob Sie alles richtig.