Trennung des Event-Handling von der GUI

Status
Nicht offen für weitere Antworten.

darkie23

Mitglied
Hallo,

ich komme gleich mal zur Sache. Ich habe mich entschlossen die Logik für das Event-Handling komplett von der GUI zu trennen. Dafür habe ich zunächst 3 Klassen erstellt. Die Klasse für die eigentliche Swing GUI, eine Klasse für das Event-Handling und eine Klasse, welche die anderen beiden instanziiert.

Nun möchte ich, dass ich beim Drücken des Buttons den Text des Labels der GUI verändern kann (über die public Funktion setText). Wie komme ich da bei actionPerformed in der Event-Klasse ran? Mit getSource() komme ich ja nur an nur an den Button selbst, der das Event ausgelöst hat oder!?

Die GUI und Event Klasse werden also folgendermaßen instanziiert:
Code:
public class Start {

	public static void main(String[] args) {
		
		Event cmd = new Event();
		GUI gui = new GUI(cmd);
		
	}
	
}

In meiner GUI ist nur ein Button mit addActionListener und ein Label enthalten:
Code:
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;

public class GUI extends JFrame {

	private JPanel jContentPane = null;
	private JButton jButton = null;
	private JLabel jLabel = null;
	private Event cmd = null;
	
	public GUI(Event cmd) {
		super();
		System.out.println(cmd);
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabel = new JLabel();
			jLabel.setText("JLabel");
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJButton(), java.awt.BorderLayout.SOUTH);
			jContentPane.add(jLabel, java.awt.BorderLayout.NORTH);
		}
		return jContentPane;
	}

	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("OK");
			jButton.addActionListener(cmd);
		}
		return jButton;
	}

         public void setText(String text) {

                  jLabel.setText(text);

         }

}

Die Event-Handling Klasse sieht ungefähr so aus, um den Button zu bedienen:

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Event 
implements ActionListener {

	public void actionPerformed (ActionEvent e) {
		// Hier möchte ich auf den Text des Labels zugreifen können und zwar indem ich indirekt die 
                  // public Funktion setText aufrufen möchte. 
	}

}

Vielen Dank im Voraus
Gruß
Darkie
 
R

Roar

Gast
die Event klasse müsste entweder
1) das JLabel/die GUI instanz kennen (böse)
oder 2) eine schnittstelle bereitstellen, die es der gui erlaubt sich bei dem eventhandler anzumelden und dann vom eventhandler benachrichtigt wird durch sowas wie labelTextChanged() und der text im label neu gesetzt wird. (besser)
oder 3) du kloppst den blöden listener einfach in die gui klasse. ist zwar unsauber, aber für so eine aufgabe wohl das einzig sinnvolle ^^

ansonten schau mal in der faq unter design patterns/observer
 

Erddrache

Mitglied
Ich machs, ums ma in nem Beispiel zu bringen, immer so, wenn ich die listener Auslagern will:
Code:
{
						exitMenuItem = new JMenuItem();
						jMenu3.add(exitMenuItem);
						exitMenuItem.setText("Exit");
						exitMenuItem.setActionCommand("Exit");
						exitMenuItem.addActionListener(new eActionMain());
					}
dann ne neue Klasse mit Namen eActionMain, die nen Listener implementiert:

Code:
public class eActionMain implements ActionListener {

	public void actionPerformed( ActionEvent e) {
		String test = e.getActionCommand();
		
		}
		if (test.equals("Exit")) {
		System.exit(0);
		}

Klappt eigentlich ganz gut...
 

darkie23

Mitglied
@Roar: Ich schau's mir gleich mal an...

@Erddrache: Die Auslagerung des Listeners stellt nicht das eigentliche Problem dar. Das Problem ist, wie der der Listener vollen Zugriff auf die GUI bekommt. Mit getsource() bekommt man leider nur Zugriff auf die direkte Quelle des Events (z.B. den Button), aber nicht vollen Zugriff auf dessen Eltern bzw. die komplette GUI.
 

darkie23

Mitglied
Ich hab grade mal bei Sun nachgeschaut (http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/events.html). Die haben da einen interessanten Beispielcode.

Kurz zusammengefasst: Die Logik erstellt die GUI und übergibt sich selbst noch als Parameter. Die GUI erstellt dann den Listener und übergibt ebenfalls die Ihr bekannte Logik. Der Listener selbst greift dann bei einem Event direkt auf die öffentliche Funktionen der Logik zu.

Klingt ja gut... mich würde aber mal interessieren ob das Übergeben der Logik von oben bis unten keine Nachteile birgt und wirklich der beste Weg ist...hmmm!?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Korrekte Trennung von GUI, Logik und Event nach MVC AWT, Swing, JavaFX & SWT 5
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
D Swing Trennung der UI- und Persistenz-Schicht AWT, Swing, JavaFX & SWT 1
A Trennung GUI und Funktion AWT, Swing, JavaFX & SWT 5
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
O Trennung GUI / Funktionalität AWT, Swing, JavaFX & SWT 3
F Zugriff auf Oberfläche bzw Trennung GUI / Logik AWT, Swing, JavaFX & SWT 3
K Trennung von GUI und Logik AWT, Swing, JavaFX & SWT 6
D Trennung von Programm und Oberfläche AWT, Swing, JavaFX & SWT 3
O Trennung Gui und Anwendungslogik AWT, Swing, JavaFX & SWT 13
O Trennung Gui und Logik - Strukturierte Client Anwendung AWT, Swing, JavaFX & SWT 4
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
Sugan Swipe Event? AWT, Swing, JavaFX & SWT 8
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
M Swing OnLoad-Event o. Ä. AWT, Swing, JavaFX & SWT 3
D Event Handling in Komplexen Anwendungen AWT, Swing, JavaFX & SWT 9
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
J Swing JMenuItem-Event?? AWT, Swing, JavaFX & SWT 3
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
F Event Handling AWT, Swing, JavaFX & SWT 7
J Button Event nur einmal ausführen AWT, Swing, JavaFX & SWT 3
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
T Callback vs. Event listener AWT, Swing, JavaFX & SWT 7
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
A Swing JButton int im Event AWT, Swing, JavaFX & SWT 9
G Swing Onkeyup Event AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
3 Swing NullPointerException in AW Event-0? AWT, Swing, JavaFX & SWT 5
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
P Swing Event das ausgelöst wird, sobald Änderung der Größe Abgeschlossen ist AWT, Swing, JavaFX & SWT 4
A Shift-Tab-Event auslösen AWT, Swing, JavaFX & SWT 5
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
W Swing Event bei Schließen des Fensters AWT, Swing, JavaFX & SWT 6
A Probleme mit dem KeyReleased-event AWT, Swing, JavaFX & SWT 3
J Doppelklick Event AWT, Swing, JavaFX & SWT 32
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
D jtabbedpane Event VOR tab-Wechsel AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Event Problem AWT, Swing, JavaFX & SWT 5
M JTree => Event Dispatching Error AWT, Swing, JavaFX & SWT 2
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
H KeyUp-Event/Ereignis AWT, Swing, JavaFX & SWT 6
C Event Frage AWT, Swing, JavaFX & SWT 7
M Swing WindowListener -> Event abbrechen? AWT, Swing, JavaFX & SWT 2
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2
R JTextField - Event bei jedem Buchstaben AWT, Swing, JavaFX & SWT 2
R WindowClosing Event - Schließen rückgängig machen? AWT, Swing, JavaFX & SWT 2
M Actionlistener ohne Event -.-?! AWT, Swing, JavaFX & SWT 2
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
D PropertyChangeListener Event auswertung AWT, Swing, JavaFX & SWT 7
O FlowLayout Button Event zuweisen? AWT, Swing, JavaFX & SWT 7
J remove() components bei event von JComboBox AWT, Swing, JavaFX & SWT 2
I event AWT, Swing, JavaFX & SWT 6
G Swing JFileChooser Event für neue Directory? AWT, Swing, JavaFX & SWT 5
X Checkboxen erstellt mit MouseClicked event AWT, Swing, JavaFX & SWT 10
Dragonfire Swing One componentResized Event AWT, Swing, JavaFX & SWT 14
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
Kr0e Event simulieren AWT, Swing, JavaFX & SWT 5
S Tastatur Event auserhalb des fokuses aufnehmen AWT, Swing, JavaFX & SWT 4
R Swing ComboBox und doppelter Event!? AWT, Swing, JavaFX & SWT 10
M Swing Event mit Button AWT, Swing, JavaFX & SWT 7
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
R Checkboxen - Event mit Controller abfangen AWT, Swing, JavaFX & SWT 7
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
O Tabelle über Event sortieren AWT, Swing, JavaFX & SWT 4
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
Dragonfire JTree, Selection via event AWT, Swing, JavaFX & SWT 7
K JButton auf JPanel in JTable (Darstellungs-/Event-Probleme) AWT, Swing, JavaFX & SWT 16
B JInternalFrame resize event AWT, Swing, JavaFX & SWT 2
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
D Event beim Laden eines JPanels? AWT, Swing, JavaFX & SWT 3
O Action Event auslösen bei unbekanntem JTextField AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben