Swing SwingUtilities invokeLater und invokeAndWait

Ollek

Bekanntes Mitglied
Hallo zusammen,

ich versuche den Einsatz und die Unterschiede der beiden oben genannten Methoden zu verstehen.

Beide Methoden legen einen Thread in die AWT Warteschleife.

invokeLater - kehrt direkt danach zurück, wann der Programmcode der abgelegt wurde bearbeitet wird, weiß niemand.

invokeAndWait - hier wird gewartet bis der abgelegte Programmcode abgearbeitet wurde und danach wird zurückgekehrt.

Habe ich es soweit richtig verstanden?

Jetzt versuche ich Bezug zu dem Einsatz zu bekommen.
Beispiel, müsste ich diesen Code in eine der beiden Methoden setzen?

Java:
		textfield.addFocusListener(new FocusAdapter() {
			@Override
			public void focusLost(FocusEvent event) {
				try {
					Integer.parseInt(txtNumberOfCodes.getText());
					textfield.setBackground(Color.WHITE);
					textfield.setToolTipText("");
				} catch (NumberFormatException e) {
					textfield.setBackground(Color.RED);
					textfield.setToolTipText("Bitte eine Zahl eingeben!");
					textfield.requestFocus();
				}
			}
		});

Oder könnt ihr mir ein Beispiel geben, wo ich es eventuell noch besser verstehen werde? :rtfm:

Grüße
 

Marco13

Top Contributor
In diesem Konkreten Beispiel nicht - sowas sollte man auch ohnehin eher mit einem DocumentListener oder einem entsprechenden How to Use Formatted Text Fields (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) machen.

SwingUtilities.invokeLater braucht man "relativ oft": Schon das erstellen eines GUIs sollte damit gemacht werden. Und immer wenn man irgendwelche Zwischenergebnisse o.a., die von einem anderen Thread berechnet werden, irgendwie ins GUI bringen will, muss man das verwenden.

SwingUtilities.invokeAndWait braucht man sehr selten (fast nie...), ... als Beispiel würde mir nur etwas vollkommen sinnlos-krampfig-konstruiertes einfallen, vielleicht hat jemand einen realistische(re)n Use-Case....
 

Ollek

Bekanntes Mitglied
Okay.
Haben das FomattedTextField genommen und folgendermaßen eingebaut:

Java:
JFormattedTextField textfield = new JFormattedTextField(NumberFormat.getIntegerInstance());
		textfields.setValue(0);

Jetzt kommt bei mir die Frage auf, wenn ich EIntragungen in der Maske erwarte, wie kann ich den User drauf hinweisen, dass dort auf jeden Fall was drinstehen muss? Da der FocusListener ja falsch ist.
Also Beispiel, User will einen Gutscheincode generieren. Dieser muss eine Anzahl von Codes haben, da dort nur Zahlen drin stehen sollen nehme ich das Formatted Textfield. Nun gibt es ein weiteres Textfield, wo auf jeden Fall was drin stehen muss und das nicht leer bleiben darf. Wie setze ich dies denn dann um?

Um zum anderen Thema zu kommen.

Also würde ich invokeLater nehmen wenn ich auf einem Button die Generierung des Gutscheincodes starte? Sprich im actionPerformed(). Oder sehe ich das falsch? Denn das wird von einem anderen Thread gemacht.

Grüße
 

Ollek

Bekanntes Mitglied
Oder wäre zur Eingabeüberprüfung das setzen einen InputVerifier richtig?

Java:
setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent input) {
				JTextField textfield = (JTextField) input;
				String inputString = textfield.getText();
				
				if(inputString.isEmpty()){
					return false;
				}else{
					return true;
				}
			}
			
	        @Override
	        public boolean shouldYieldFocus(JComponent input){
	            if (!verify(input)){
	                input.setBackground(java.awt.Color.RED);
	                return false;
	            }else {
	                input.setBackground(java.awt.Color.WHITE);
	                return true;
	            }
	        }
		});


Grüße
 

Marco13

Top Contributor
Ja, der InputVerifier würde dann an's JFormattedTextField gehängt.

Wenn die Generierung schon in einem anderen Thread läuft, kann man die Ergebnisse (von diesem Thread aus) am Ende mit SwingUtilities.invokeLater nach Swing zurückgeben.

Wenn die Generierung aber bisher nur eine einzelne (zeitaufwändige) Methode ist, kann man dafür aber ggf. auch gleich einen SwingWorker verwenden. Der ist quasi die "Gegenrichtung" zu SwingUtilities.invokeLater
- Langwierige Aufgaben "aus dem Swing-Thread raus": SwingWorker
- Ergebnisse aus einem anderen Thread "in Swing rein": SwingUtilities.invokeLater

Der SwingWorker ist aber speziell für solche Sachen gemacht, d.h. er bietet auch Möglichkeiten, die Ergebnisse der langwierigen Berechnungen wieder nach Swing zurück zu bringen, ohne dass man nochmal händisch mit SwingUtilities rummachen muss.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Swing SwingUtilities.invokeLater wie konsequent anwenden? AWT, Swing, JavaFX & SWT 3
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
G Frage zu SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 16
G Frage zu SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 9
B SwingUtilities.invokeLater() AWT, Swing, JavaFX & SWT 12
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
G LookAndFeel SwingUtilities.updateComponentTreeUI(frame) <- wie heißt mein Frame? AWT, Swing, JavaFX & SWT 5
J Alternative für SwingUtilities Schachteln AWT, Swing, JavaFX & SWT 2
G Vector ArrayIndexOutOfBoundsException SwingUtilities.invokeL AWT, Swing, JavaFX & SWT 5
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
X Swing GUI-Änderungen mit invokeLater AWT, Swing, JavaFX & SWT 4
B Swing invokeLater nötig beim GUI erstellen? AWT, Swing, JavaFX & SWT 10
H invokeLater Problem AWT, Swing, JavaFX & SWT 8
I Swing Wann invokeLater() verwenden? AWT, Swing, JavaFX & SWT 7
E einfache Frage zu invokeLater() AWT, Swing, JavaFX & SWT 4
G Schachtelung bei invokeLater AWT, Swing, JavaFX & SWT 4
F invokeLater() vs synchronized(Object) AWT, Swing, JavaFX & SWT 5
T invokeLater - Wann? AWT, Swing, JavaFX & SWT 29
L invokeLater in der main-Methode AWT, Swing, JavaFX & SWT 6
D GUI in JFrame mit invokeLater verändern AWT, Swing, JavaFX & SWT 5
M GUI in Verbindung mit invokeLater() bzw. invokeAndWait() AWT, Swing, JavaFX & SWT 2
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
T Probleme mit invokeAndWait AWT, Swing, JavaFX & SWT 13
A Problem mit InvokeAndWait - JLabel Text verändern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben