Verursacher für Event herausfinden ?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!
Ich habe folgendes Problem mit dem Eventhandling bei Swing:

Für einen Scrollbar nutze ich einen JScrollbar, sowie für einen Zoomregler einen JSlider.
Der Scrollbar verschiebt den Inhalt eines Canvas-Objektes, indem ich mit einem AdjustmentListener an ihm lausche und das AdjustmentEvent abfange.
Am Zoomregler lauscht ein ChangeListener und fängt das ChangeEvent ab.
Wenn am Zoomregler nun das ChangeEvent auftaucht, da der Anwender am Zoom gedreht hat, soll entsprechend auch der JScrollbar-Value geändert werden. Dies tue ich durch den Aufruf "scrollbar.setValue(neuerWert)".
Dieser Aufruf löst jedoch ein AdjustmentEvent am Scrollbar aus, welches für mich absolut nicht zu unterscheiden ist, von einem solchen, das direkt durch Bewegen des Scrollbars entsteht.
Dort liegt jedoch für mich das Problem, da ich in diesem Fall im AdjustmentListener ein anderes Verhalten (insbesondere kein erneutes 'Verschieben') veranlassen möchte.

Daher meine Frage:
Kann man von einem Event herausfinden, wer es geschickt hat ? Hier also, ob es von JSlider's ChangeEventListener heraus erzeugt wurde, oder direkt vom JScrollbar ?
Alternativ: Gibt es anstelle von "scrollbar.setValue(wert)" auch sowas wie "scrollbar.setValue(wert, custumParameters)", so dass die customParameters den Listenern des Scrollbars zugänglich werden können ?
Oder weiss jemand eine andere Lösung ?

Danke!
kopfsalat
 

kopfsalat

Bekanntes Mitglied
Ich hoffe, ich habe meine Frage nicht zu umständlich geschrieben.
Die war übrigens von mir (ich war nicht eingeloggt).
 

Sky

Top Contributor
kopfsalat hat gesagt.:
Ich hoffe, ich habe meine Frage nicht zu umständlich geschrieben.
Das könnte eine Ursache sein, warum ich die Frage zuerst falsch verstanden habe ;-)

Vielleicht arbeite ich aber auch nur zu lange ;-)
 
S

SlaterB

Gast
mit event.getSource() kommst du wohl nicht weit oder?

ich setze in solchen Fällen immer eine Variable:
Code:
listener() {

if (reagiereAufEvent) {
   reagiereAufEvent = false;
   doSomething();
   reagiereAufEvent = true;
}

}
 

kopfsalat

Bekanntes Mitglied
@SlaterB
So ähnlich hatte ich das auch bisher gemacht, hier ein Beispiel:
Code:
package swingEventTest;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class TestFrame extends JFrame {
	JScrollBar	scrollbar;
	JSlider		slider;
	JTextArea	outText;
	
	boolean scrollbarlocked = false;
	
	public TestFrame() {
		super("Move the slider and the horizontal scrollbar");
		
		scrollbar = new JScrollBar(JScrollBar.HORIZONTAL, 50, 10, 0, 100);
		slider = new JSlider(0, 100, 50);
		outText = new JTextArea();
		outText.setAutoscrolls(true);
		
		scrollbar.addAdjustmentListener(new AdjustmentListener () {
			public void adjustmentValueChanged(AdjustmentEvent e) {
				if (scrollbarlocked == false) {
					outText.append("!!scrollbar driven by itself!!\n");
				} else {
					outText.append(">>scrollbar driven by slider<<\n");
				}
			}
		});
		
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				scrollbarlocked = true;
				scrollbar.setValue(slider.getValue());
				scrollbarlocked = false;
			}
		});
		
		setLayout(new BorderLayout());
		add(scrollbar, BorderLayout.NORTH);
		add(slider, BorderLayout.SOUTH);
		add(new JScrollPane(outText), BorderLayout.CENTER);
		
		setSize(750,400);		
		setVisible(true);
	}
	
	public static void main(String [] args) {
		new TestFrame();
	}
}

Was mich hierbei aber stört, ist:
a) es ist nicht sonderlich schön, diesen Umweg über eine externe Variable zu gehen. Für die Informationstrennung wäre es 'schöner', wenn man direkt beim Event dessen Verursacher erkennen könnte. Hier also, wenn man innerhalb von adjustmentValueChanged() einen Aufruf e.getCaller() hätte, der hier ggf. die Instanz des ChangeListeners zurückliefert, von dem aus setValue() auf scrollbar aufgerufen wurde. Alternativ wäre es hilfreich, einen Aufruf scrollbar.setValue(slider.getValue(), EVENENTPARAMETER) machen zu können, so dass EVENTPARAMETER in das AdjustmentEvent hineinkopiert wird.

b) Obiges Beispiel funktioniert, da das nach dem Aufruf von scrollbar.setValue(slider.getValue()); die AdjustmentListener mit ihren Events komplett abgearbeitet werden, bevor im ChangeListener mit der nächsten Zeile fortgefahren wird. Ich denke aber nicht, dass man sich darauf verlassen kann - an sich ist doch das Event-System durchaus völlig asynchron angelegt ?

Fällt vielleicht noch jemandem eine andere Lösung ein ? Deine Variante ist ja auch etwas anders. Wenn reagiereAufEvent einmal von außen auf false gesetzt wurde, dann wird es selbständig nicht wieder true - es muss erst von außen wieder auf true gesetzt werden. Ich sehe aber nicht, wie ich das in obiges Beispiel sinnvoll einsetzen könnte.
 

kopfsalat

Bekanntes Mitglied
Hi!
Ich hätte jetzt eine Lösung - wenn sie funktionierte:

Ich sende einfach mein eigenes AdjustmentEvent an den JScrollBar.
Dann sollte dieser sich doch eigentlich nach dem neuen Wert einstellen und dann dieses Event an den Listener weiterleiten, wo das Event weiter ausgewertet werden kann.
So könnte ich sogar von AdjustmentEvent erben und noch viel mehr Daten an den Listener schicken.

Problem:
Wie sende ich ein Event manuell an scrollbar ? Irgendwie klappt das mit scrollbar.dispatchEvent(AWTEvent) nicht.
Was mache ich falsch ?

Code:
package swingEventTest;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class TestFrame2 extends JFrame {
	JScrollBar	scrollbar;
	JSlider		slider;
	JTextArea	outText;
	
	public static final int SLIDERSOURCE = AdjustmentEvent.ADJUSTMENT_LAST + 1;
	
	public TestFrame2() {
		super("2nd test: Move the slider and the horizontal scrollbar");
		
		scrollbar = new JScrollBar(JScrollBar.HORIZONTAL, 50, 10, 0, 100);
		slider = new JSlider(0, 100, 50);
		outText = new JTextArea();
		outText.setAutoscrolls(true);
		
		scrollbar.addAdjustmentListener(new AdjustmentListener () {
			public void adjustmentValueChanged(AdjustmentEvent e) {
				if (e.getID() == SLIDERSOURCE) {
					outText.append(">>scrollbar driven by slider<<\n");
				} else {
					outText.append("!!scrollbar driven by itself!!\n");
				}
			}
		});
		
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				scrollbar.dispatchEvent(new AdjustmentEvent(scrollbar, SLIDERSOURCE, 0, slider.getValue()));
			}
		});
		
		setLayout(new BorderLayout());
		add(scrollbar, BorderLayout.NORTH);
		add(slider, BorderLayout.SOUTH);
		add(new JScrollPane(outText), BorderLayout.CENTER);
		
		setSize(750,400);		
		setVisible(true);
	}
	
	public static void main(String [] args) {
		new TestFrame2();
	}
}
 

kopfsalat

Bekanntes Mitglied
Sorry für das Pushen, aber hat jemand noch eine Idee zu meinem letzten Posting ?
Das ist inhaltlich auch völlig unabhängig zu allem vorher Geschriebenen, so dass man dieses Topic gar nicht komplett lesen muss.

Zentrale Frage nochmal: Warum klappt das dispatchEvent() in Zeile 37 nicht so, wie ich dachte ?
 

kopfsalat

Bekanntes Mitglied
So, ich habe nun endlich eine erste Lösung gefunden, auch wenn die etwas kompliziert erscheint.

Zum einen muss ich dazu von JScrollBar erben, um die fireAdjustmentValueChange()-Methode public zu machen. fireAdjustmentValueChange() schickt dann zwar das Event an die Listener, ändert aber nicht den Wert des Scrollbars (der im BoundedRangeModel gespeichert ist).
Daher muss ich noch den Wert des Scrollbars im BoundedRangeModel ändern können, ohne dass erneut von diesem aus ein AdjustmentEvent gefeuert wird, wozu ich von ihm erben muss und einige Methoden überschreiben.

Dann aber erhalte ich in etwa das gewünschte Verhalten: Nun können im AdjustmentEvent-Listener auch eigene AdjustmentEvents mit eigenen Typen ankommen, so dass in Abhängigkeit davon ein Verhalten gewählt werden kann. Dabei kann auch der Wert des Scrollbars gesetzt werden, ohne dass ein weiteres AdjustmentEvent geschickt wird.

Hier der Source:
Code:
package swingEventTest;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class TestFrame3 extends JFrame {

	static class MyJScrollBar extends JScrollBar {
		private MyBoundedRangeModel myModel;
		
		public MyJScrollBar() {
			super();
			myModel = new MyBoundedRangeModel();
			setModel(myModel);
		}

		public MyJScrollBar(int orientation) {
			super(orientation);
			myModel = new MyBoundedRangeModel();
			setModel(myModel);
		}

		public MyJScrollBar(int orientation, int value, int extent, int min, int max) {
			super(orientation, value, extent, min, max);
			myModel = new MyBoundedRangeModel(value, extent, min, max);
			setModel(myModel);
		}
		
		public void setValueWithoutFiringEvent(int n) {
			myModel.setValueWithoutFiringEvent(n);
			updateUI();
		}
		
		public void fireAdjustmentValueChanged(int id, int type, int value) {	// overrides protected visibility 
			super.fireAdjustmentValueChanged(id, type, value);
		}
	}
	
	static class MyBoundedRangeModel extends DefaultBoundedRangeModel {
		private int myValue = 0; 
		
		public MyBoundedRangeModel() {
			super();
		}

		public MyBoundedRangeModel(int value, int extent, int min, int max) {
			super(value, extent, min, max);
			this.myValue = value;
		}
		
		public int getValue() {	// overrides getValue()
			return myValue;
		}
		
		public void setValue(int n) { // overrides setValue()
			super.setValue(n);
			myValue = super.getValue();
		}

		public void setValueWithoutFiringEvent(int n) {
			myValue = Math.min(getMaximum(), Math.max(n, getMinimum())); 
		}		
	}
	

	MyJScrollBar	scrollbar;
	JSlider			slider1;
	JSlider			slider2;
	JTextArea		outText;
		
	public static final int ADJUSTMENTTYPE_SLIDERSOURCE = -1;
	
	public TestFrame3() {
		super("3rd test: Move the sliders and the horizontal scrollbar");
		
		scrollbar = new MyJScrollBar(MyJScrollBar.HORIZONTAL, 50, 10, 0, 100);
		slider1 = new JSlider(0, 100, 50);
		slider2 = new JSlider(0, 100, 50);
		outText = new JTextArea();
		outText.setAutoscrolls(true);
					
		scrollbar.addAdjustmentListener(new AdjustmentListener () {
			public void adjustmentValueChanged(AdjustmentEvent e) {
				if (e.getAdjustmentType() == ADJUSTMENTTYPE_SLIDERSOURCE) {
					scrollbar.setValueWithoutFiringEvent(e.getValue());
					outText.append("Scrollbar driven by it's listener after receiving a custom AdjustmentEvent-type\n");
				} else {
					outText.append("Scrollbar driven by moving itself\n");
				}
			}
		});
		
		slider1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				scrollbar.fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, ADJUSTMENTTYPE_SLIDERSOURCE, slider1.getValue());
			}
		});
		
		slider2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				scrollbar.setValueWithoutFiringEvent(slider2.getValue());
				outText.append("Slider's listener moved the scrollbar without provoking any AdjustmentEvent\n");
			}
		});
		
		setLayout(new BorderLayout());
		add(scrollbar, BorderLayout.NORTH);
		add(new JScrollPane(outText), BorderLayout.CENTER);
		JPanel p = new JPanel(new GridLayout(1,2));
		p.add(slider1);
		p.add(slider2);
		add(p, BorderLayout.SOUTH);
		
		setSize(750,400);		
		setVisible(true);
	}
	
	public static void main(String [] args) {
		new TestFrame3();
	}
}

Vielleicht sieht noch jemand eine elegantere Möglichkeit ?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
C JavaFX Character Comparator für TableColumn AWT, Swing, JavaFX & SWT 0
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
S Pfad für Speichervorgang auswählen AWT, Swing, JavaFX & SWT 11
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
R JMenuItems für Touchscreen auseinanderziehen AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
G Grafikformat für AWT-Applet? AWT, Swing, JavaFX & SWT 0
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
Z JavaFX TableView cellValueFactory für Arrays AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben