Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen

Hallo und frohes neues Jahr!

Ich habe eine bereits funktionierende Komponente auf Basis JPanel gebaut. Diese agiert für sich selber und hat einen gewissen Inhalt. Der Inhalt kann - auf Basis von MouseEvents - vom Nutzer verändert werden. Das Program kann diesen Inhalt zu jeder beliebigen Zeit auslesen oder ändern.

Jetzt meine Frage: Wenn der Nutzer den Inhalt geändert hat, macht es aus meiner Sicht Sinn, das Program davon über ein Event (ChangeEvent?) in Kenntnis zu setzen. Gibt es dafür irgendwelche Unterstützung? Also etwas, das ich mit einbinden kann? Ich kann die EventListenerList verwenden oder die Klassen Observer und Observable, gibt es noch etwas was ich übersehen habe, was näher an dem GUI orientierten ChangeListener (oder vielmehr an dessen Gegenstück) angelehnt ist?

Vielen Dank,
Stephan
 

André Uhres

Top Contributor
Hallo Stephan,

das sieht imho nach einem Fall für MVC aus. Besagter Listener wäre dann ein Modellistener, der ja beim MVC-Konzept auch von der View implementiert wird.

Gruß,
André
 
Hallo, also MVC schien mir dafür etwas oversized... Die Komponente hat ja auch gekapselt intern das model im Prinzip, das macht m.E. nach Datenkapselung auch Sinn. Sie soll halt bloß Bescheid sagen, wenn sich eben dieser Wert geändert hat. MVC find ich toll, wenn ich umfangreiche Daten von der View trennen will / kann. Aber bei grafischen Komponenten sind die Dinger doch sehr eng miteinander verbunden, denkst du nicht?

Stephan
 

bERt0r

Top Contributor
Nun du kannst natürlich einen PropertyChangedListener verwenden. Um den für deine Komponente zu machen, kannst du aber auch gleich einen eigenen Listener schreiben. Ist fast die gleiche Arbeit.
 
@bERt0r: Ja, den habe ich heute auch entdeckt, danke für den Hinweis. Gibt es denn etwas, dass ich dort einbinden kann? Wo ich z.B. bereits die addPropertyChangeListener() Methode mitbekomme? Und die interne Struktur für die Verwaltung der Listener Liste? Jetzt hab ich das erstmal über die ListenerList gemacht, geht, aber vielleicht geht's ja noch besser?!?

@Andre: Es war auch gar nicht der Umfang der Daten, der mir den Eindruck aufdrängt MVC wäre oversized, sondern eher, dass ich gar nicht wirklich Model, View und Controller trennen wollte. Ich finde, das macht durchaus Sinn diese Dinge innerhalb einer Komponente zusammen zu lassen. MVC ist toll, wenn die Daten von der View trennbar sind oder die Logik (Controller) trennbar ist, aber die Komponente macht erst Sinn, wenn Sie als View mit einer vernünftigen Logik sowie sinnvollen Daten verbunden ist? Außerdem stellt sich dann auch hier die Frage, ob es im Framework Klassen zu Wiederverwendung gibt?

Stephan
 

bERt0r

Top Contributor
Nun, wenn du mal beschreiben würdes was du eigentlich machst, könnten wir dir auch konkrete Ratschläge geben, was "besser" geeignet ist :)
 

André Uhres

Top Contributor
@Andre: ... aber die Komponente macht erst Sinn, wenn Sie als View mit einer vernünftigen Logik sowie sinnvollen Daten verbunden ist? Außerdem stellt sich dann auch hier die Frage, ob es im Framework Klassen zu Wiederverwendung gibt?

Das Swing Framework bietet etwa ein Dutzend Model-Varianten an, auf die wir zurückgreifen können: ButtonModel, ComboBoxModel, BoundedRangeModel, SingleSelectionModel, ListModel, ListSelectionModel, TableModel, TableColumnModel, TreeModel, TreeSelectionModel, Document. View+Controller bleiben in Deinem Fall wohl besser als Einheit zusammen. Wir können sie im Konstruktor mit einem "default" Model versehen. Sie kann dann ohne Weiteres, und trotzdem flexibel eingesetzt werden.

Gruß,
André
 
Also, ganz allgemein wollte ich bloß möglichst "sauber" eine eigene Komponente erstellen. D.h. mir ging es um den Ansatz, wie man das mit den Callbacks für grafische Komponenten grundsätzlich am einfachsten / sinnigsten machen kann. Im Speziellen habe ich mir eine kleine Komponente gebaut zur Eingabe einer Uhrzeit; Datum verwende ich etwas fertiges, aber Uhrzeit hatte ich nix gefunden. Und eine Komponente (im Allgemeinen, bei der "Uhr" natürlich auch) meldet ja einen veränderten "Inhalt" zurück an die Applikation...

BoundedRangeModel ist mir schon zu speziell, für eine Komponente die genau das tut, wäre es wohl ok. Deshalb bin ich auch gegen MVC - entweder müsste der Controller ein active Polling machen, oder ich brauche einen Listener zwischen Model und Controller und genau danach suche ich ja. So gesehen könnte ich die Komponente als View betrachten und die Applikation implementiert Model und Controller. Aber active Polling will ich ja nicht gar nicht.

@Andre: Hey, das ist vielleicht das Stichwort... An die xxxModels (nix erotisches hier! ;) ) hatte ich gar nicht gedacht, ich war immer in der Ecke Event, Listener, etc. unterwegs und hab dort was gesucht. Vielleicht passt das ButtonModel für meine Komponente am Besten, da war ich bisher einfach noch nicht drauf gekommen...

Stephan
 

bERt0r

Top Contributor
Ich hab dir ein kleines Beispiel gemacht, ist eigentlich weniger Arbeit als ich dachte mit dem PropertyChangeListener:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;

public class UhrPanel extends JPanel {

	List<ChangeListener> changeListeners=new ArrayList<ChangeListener>();
	private JTextField textField;
	public UhrPanel() 
	{
		
		textField = new JTextField();
		textField.setColumns(5);
		textField.setEditable(false);
		add(textField);
		TimerTask t=new TimerTask()
		{
			Calendar c=Calendar.getInstance();
			SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");
			@Override
			public void run() 
			{
				Date oldDate=c.getTime();
				c.add(Calendar.SECOND, 1);
				Date newDate=c.getTime();
				textField.setText(format.format(newDate));
				UhrPanel.this.firePropertyChange("uhrzeit", oldDate, newDate);
			}
		};
		Timer timer=new Timer();
		timer.scheduleAtFixedRate(t, 0, 1000);
	}
	
	public static void main(String args[])
	{
		EventQueue.invokeLater(new Runnable(){

			@Override
			public void run() {
				
				JFrame frame=new JFrame();
				UhrPanel uhr=new UhrPanel();
				frame.getContentPane().add(uhr,BorderLayout.CENTER);
				uhr.addPropertyChangeListener("uhrzeit",new PropertyChangeListener()
				{
					@Override
					public void propertyChange(PropertyChangeEvent e) {
						System.out.println("Uhrzeit changed to from "+e.getOldValue()+" to "+e.getNewValue());
					}
				});
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.pack();
				frame.setVisible(true);
			}	
		});
	}
}
 
Funktioniert tatsächlich. Wat so 'ne Pogge für'n Speck hat... ;) Dann stellt sich noch eine theoretische Frage. Ich hab das jetzt (erstmal, damit ich weitermachen konnte) mit einem selbst erstellten ChangeListener/Event gebaut. Aber es gäbe ja verschiedene Möglichkeiten:
- ChangeListener (weil es das Schlüsselmerkmal dieser Komponente ist)
- ActionListener (weil es eben die Standardänderung/aktion ist, die mit dieser Komponente ausgelöst wird)
- PropertyListener (weil es eine Veränderung an einem Merkmal ist)

Welche davon passt am Besten zu den Event/Listener Konzepten, die in den Standardkomponenten bereits genutzt werden?

Stephan
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35

Ähnliche Java Themen

Neue Themen


Oben