Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hallo
ich habe eine ziemlich einfache frage und zwar würde ich gerne mithilfe eines Keylisteners eine gedrückte Taste mit "JOptionPane.showMessageDialog(null,"Hier die Taste")"
ausgeben. Hat jemand ein kurzes beispielprogramm?
Grüße
Hast du denn ein Bsp-Programm? Versuche es doch einfach mal, die API zeigt dir alle Konstruktoren und Methoden für eine Klasse. Wenn du zB nicht mal weisst wie man eine Methode aufruft, solltest du nix mit Listenern machen sondern erstmal die Basics lernen.
Wenn du konkreten Code hast und dort etwas nicht funktioniert, dann helfe ich dir gerne weiter. Aber so nicht mein Freund
Hab zwar noch nicht soviel mit Threads gearbeitet aber wenn nachdem was ich unter SwingUtilities gelesen habe, dient es dazu, das eigentl. Fenster (JFrame) erst dann Sichtbar zu machen, wenn alle vorherigen Prozesse abgeschlossen sind. Das verzögern löst hier das invoakeLater aus
Eine eigne EventQueue dafür ist ziemlich "schweres Geschütz" - es gibt nur SEHR wenige Fälle, wo das wirklich angebracht ist. Als ... "Reihenfolge" dessen, was sinnvoll ist, könnte man grob(!!!) sagen:
1. KeyListener
2. Wenn es damit nicht geht: KeyBindings
3. Wenn es damit nicht geht: AWTEventListener
4. Wenn es damit nicht geht: EventQueue
Die letzten beiden aber wirklich nur in wenigen Ausnahmefällen...
@tomate und schandro:
Ich weiss schon, was der EDT ist, aber ich dachte setVisible() ist eine Methode die eh auf dem EDT ausgeführt wird?!
Werden denn nicht alle Standard AWT/Swing Methoden, die eine grafische Änderung hervorrufen, automatisch auf dem EDT ausgeführt?
Nein. Sie MÜSSEN auf dem EDT ausgeführt werden, aber das passiert nicht automatisch (siehe Single Thread Rule, Threads and Swing )
Wobei mir das mit dem Bauen des GUI und dem setVisible auch nie wirklich 100% eingeleuchtet hat: Diese Regel greift eigentlich erst für "sichtbare" Components - bei der Aussage, setVisible "müßte" im EDT ausgeführt werden, wird irgendwie definiert, dass nicht die Henne sondern das Ei zuerst da war...
EDIT: BTW: Auf der verlinkten Seite steht, zwar dass das Bauen außerhalb des EDT OK sein KANN, aber man muss ein bißchen Aufpassen...
"Nachteile" - hm ... man macht das schlicht und einfach nicht so. Es ist ein ziemlich low-leveliger Eingriff in die gesamte Eventverarbeitung. Natürlich kannst du zum Postamt gehen, und dort sämtliche Briefe durchsuchen, um zu sehen, ob vielleicht einer für dich dabei ist. Du kannst aber auch warten, bis der Postbote dir deine Briefe in den Briefkasten wirft...
Ich weiss schon, was der EDT ist, aber ich dachte setVisible() ist eine Methode die eh auf dem EDT ausgeführt wird?!
Werden denn nicht alle Standard AWT/Swing Methoden, die eine grafische Änderung hervorrufen, automatisch auf dem EDT ausgeführt?
Einige Swing Komponentenmethoden sind in der API Spezifikation als "thread safe" gekennzeichnet;
solche Methoden können von irgendeinem Thread sicher aufgerufen werden.
Alle anderen Swing Komponentenmethoden müssen vom Event Dispatch Thread aus aufgerufen werden.
Programme, die diese Regel ignorieren, könnten zwar meistens korrekt laufen,
sind aber unvorhersehbaren Fehlern unterworfen, die schwer nachvollziehbar sind.
Lies mehr dazu...
Die main läuft auf dem Initial Thread, die Gui muss aber auf dem Thread
laufen, welcher der graphischen Anzeige gewidmet ist (EventDispatchThread).
Die main muss also die Gui Initialisierung etwa so aufrufen:
Code:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
}
In Swing Programmen haben die Initial Threads nicht viel zu tun. Ihre Hauptaufgabe ist ein Runnable Objekt anzulegen, das die GUI initialisiert, und dieses Objekt zur Ausführung
auf den Event Dispatch Thread zu schicken.
Ein Initial Thread schickt den GUI Initialisierungsantrag auf den Event Dispatch Thread mit dem Aufruf von
javax.swing.SwingUtilities.invokeLater oder javax.swing.SwingUtilities.invokeAndWait.
Lies mehr dazu...