Korrektes manipulieren der GUI aus anderen Threads heraus

Status
Nicht offen für weitere Antworten.

roxX0r

Mitglied
Hallo!

Ich hab zur Zeit einen richtig üblen Käfer im Programm, der wirklich sehr unregelmäßig auftritt und auch nicht immer und auch nicht bei jedem. Bei dem Bug crasht die JVM mit einem schönen Errorlog. Soweit so gut. Ich bin mir relativ sicher, dass dieser Crash von Swing herrührt, da die dll Datei, die den Crash verursacht die: "comctl32.dll" ist und diese wohl für Dialoge usw. verantwortlich ist (in Windows).

Meine generelle Frage ist jetzt: wie programmiere ich am saubersten mit Swing, wenn ich aus anderen Threads heraus, die Oberfläche aktualisieren möchte? D.h. in "Labels" neuen Text setzen, in Tabellen neue Rows hinzufügen usw. Nach meinem wissenstand sollte ein "EventQueue.invokeLater" mit den entsprechenden Befehlen ausreichen. Diesen Aufruf habe ich dann in meinem Thread drin.

Dann noch eine andere Möglichekit, wie ich was aufrufe.
In meinem GUI Thread habe ich eine statische Funktion, die die GUI aktualisieren soll. Diese Funktion bekommt einen Wert und sagen wir ein Label bekommt diesen Wert dann als Text. Und in dieser statischen Funtkion, hab ich das EventQueue.invokeLater Konstrukt drin. D.h. mein Thread ruft diese statische Funktion hin und wieder auf, um die GUI zu aktualisieren, könnte es nun ein Problem sein, dass das EventQueue in meinem GUI Thread drin ist? Eigentlich doch nicht, EventQueue und invokeLater sind eh alles statische Funkionen..

Ich weiß nicht, vielleicht hab ich auch nen Denkfehler mit der ganzen Swing Sache. Evtl. liegts da auch garnicht dran, vielleicht dürfte die JVM garnicht crashen, auch wenn ich mit Swing schindluder treiben würde? Dann sollte es womöglich Java Exceptions geben, aber gleich die JVM abschmieren?

Wenn mir dieses CrashLog mehr infos geben würde.... mehr Infos als Hexadezimale Speicheradressen ...

Aufjedenfall hat der Crash was mit dem AWT Thread zutun und in dieser blöden DLL Datei, die im folgenden Ordner liegt:

C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll

Stack: [0x03350000,0x033a0000], sp=0x0339e7c4, free space=313k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x000c013a
C [comctl32.dll+0x1207c]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j sun.awt.windows.WToolkit.eventLoop()V+0
j sun.awt.windows.WToolkit.run()V+69
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub

=>0x031b1c00 JavaThread "AWT-Windows" daemon [_thread_in_native, id=544, stack(0x03350000,0x033a0000)]



Ich bin für alle Gedanken dankbar :)
 

L-ectron-X

Gesperrter Benutzer
Welches Windows benutzt du?
Bringe zunächst mal deinen Grafikkartentreiber auf den aktuellen Stand.
 

roxX0r

Mitglied
Wie gesagt, es passiert nicht bei mir. Mein Programm nutzen ziemlich viele Leute (~300) und ich höre recht häufig von dem Problem. der eine hat XP, der andere Vista. Kann mir nicht vorstellen, dass es am System liegt. ES gibt auch das Problem, dass bei einigen das Programm abstürzt, wenn sie es hin und her schieben ... Irgendwie hat die GUI nen knacks und ich weiß nicht wodran das liegt. Das Teil crasht immer mit ner "EXCEPTION_ACCESS_VIOLATION". Irgendwie muss es den Speicher zerschießen. Dem Stacktrace nach zuurteilen muss es ja im AWT Thread passieren ...
 

roxX0r

Mitglied
Vielleicht wenigstens jemand ne Idee, wie ich vielleicht mehr Infos zu dem Bug bekommen könnte?

eventLoop(); im Wtoolkit ist eine native Funktion in irgendeiner DLL, da kann ma also auch nicht mal reinschauen...

irgendein logger in dem Toolkit oder sowas, irgendwie bräuchet ich mehr Infos, wann genau das passiert. Es passiert wohl recht häufig beim Minimieren des Programmes oder Verschieben, aber auch nicht immer... so ein mist!
 

Wildcard

Top Contributor
Zunächst mal, ein VM Crash ist niemals ein Programmierfehler, sondern ein Bug in der VM oder einer nativen Bibliothek (entweder selbst geladen, durch die VM, oder das OS).
That said kann ein Programmierfehler dafür verantwortlich sein das dieser Bug getriggert wird.
Zum richtigen Threading in Swing:
invokeLater ist das richtige Stichwort. Man muss hier allerdings vorsichtig sein, denn manchmal ändert man die GUI aus dem falschen Thread ohne sich dessen bewusst zu sein und auch diese Zugriffe müssen synchronisiert werden. Beispiel:
Du hast ein Modell. Ein Controller (oder View) platziert einen Listener auf dem Modell um die GUI zu aktualisieren wenn sich das Modell ändert.
-Ein Background Thread ändert das Modell
-Die Listener werden informiert
-Der Controller empfängt das Event
-Der Controller aktualisiert die GUI
-BOOM du warst im falschen Thread

SWT geht da geschickter vor und wirft in diesem Fall direkt eine Exception, Swing schluckt es und verschluckt sich dann später an anderer Stelle, crashed die VM oder malt deine Taskleiste plötzlich karriert, das ist undefiniert.
Bau an den kritischen Stellen erstmal eine Threadprüfung und wirf gegebenfalls direkt eine Exception um dem Problem auf die Schliche zu kommen.
SwingUtilities#isEventDispatchThread hilft dir dabei.
 

Ebenius

Top Contributor
[...] Swing schluckt es und verschluckt sich dann später an anderer Stelle, crashed die VM oder malt deine Taskleiste plötzlich karriert, das ist undefiniert.
Etwas übertrieben. :) Die VM darf nicht crashen. Und die Taskleiste darf auch nicht kariert gemalt werden. Deine Anwendung gerät aber tatsächlich in einen undefinierten Zustand.

Bau an den kritischen Stellen erstmal eine Threadprüfung und wirf gegebenfalls direkt eine Exception um dem Problem auf die Schliche zu kommen.
SwingUtilities#isEventDispatchThread hilft dir dabei.
Die Prüfung machst Du am besten so:
Java:
assert SwingUtilities.isEventDispatchThread();
Dann startest Du die Applikation zum Test mit Assertions (VM-Schalter [c]-ea[/c]). So kann die Prüfung immer im Code bleiben. Wenn die Assertions eingeschaltet sind (in Testumgebungen), fliegt ein AssertionError wenn die Methode von einem anderen Thread als dem EDT aufgerufen wird. Wenn die Assertions ausgeschaltet sind (also auf Produktivsystemen), wird die Prüfung nicht gemacht.

-Ein Background Thread ändert das Modell
-Die Listener werden informiert
Der Fehler liegt in diesem Beispiel übrigens in einem dieser beiden Punkte. Entweder ist das Modell nicht Thread-save; dann darf kein Background-Thread das Modell verändern. Oder das Modell ist Thread-save, dann muss es die Listener über den EDT benachrichtigen.

Ebenius
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Es gibt theoretisch auch Möglichkeiten, die Einhaltung der Regel automatisch zu überprüfen - sowas wie Java theory and practice: Testing with leverage, Part 3 oder The Java Code Monkey: Using AspectJ to detect violations of the Swing single thread rule. ... hab' das aber noch nicht selbst getestet.


Der Fehler liegt in diesem Beispiel übrigens in einem dieser beiden Punkte. Entweder ist das Modell nicht Thread-save; dann darf kein Background-Thread das Modell verändern. Oder das Modell ist Thread-save, dann muss es die Listener über den EDT benachrichtigen.

Hmm... Ich denke, dass ein Modell seine Listener NICHT über den EDT benachrichtigen sollte. Ein Modell sollte ja (theoretisch, in gewissen Grenzen) nicht mal wissen, dass es ein GUI gibt. Vielleicht hängt noch eine andere Modellklasse als Listener daran, und DIE sollte sicher nicht über den EDT benachrichtigt werden. Ich würde den Listener direkt benachrichtigen. Bei Swing Models ist es so, dass nichtmal in der Doku eine Aussage darüber gemacht wird, auf welchem Thread die Listener benachrichtigt werden - tatsächlich ist es aber afaik immer(!) der Thread, der auch die Änderung vorgenommen hat. FALLS einer der Listener einer ist, der gerne an einer Swing-Component was ändern will, dann sollte der sich darum kümmern, die Änderung auf dem EDT zu machen, oder man sollte einfordern, dass das Modell auch nur über den EDT verändert werden darf. (Das ist bei Swing etwas versteckt - aber da potentiell JEDE Änderung am Modell auch "...might affect or depend on the state of that component"... dürfen eben auch die Modelle nur über den EDT geändert werden)
 

Ebenius

Top Contributor
(Das ist bei Swing etwas versteckt - aber da potentiell JEDE Änderung am Modell auch "...might affect or depend on the state of that component"... dürfen eben auch die Modelle nur über den EDT geändert werden)
Ein Swing-Modell muss (in der Regel -- Ausnahme zum Beispiel Document) seine Zuhörer auf dem EDT benachrichtigen, da sich alle Komponenten (ausgenommen JTextComponent) darauf verlassen. Im Regelfall überlässt die Modellimplementation diese Aufgabe dem Aufrufenden. Alle DefaultXYZModel-Implementierungen tun dies. Spezielle Implementierungen können das aber auch anders regeln. Wichtig ist dabei, dass das Modell sowohl seine eigene Zuständsänderung synchron zum EDT ausführt als auch die Zuhörer auf dem EDT benachrichtigt.

Ein nicht unübliches Beispiel eines Modelles das selbst multi-threaded arbeitet und seinen eigenen Zustand synchron zum EDT ändert, wäre ein Modell eines Verzeichnisbaums, der erst auf Anfrage die Kinder eines Knotens vom Dateisystem liest. Das Modell würde die Anzahl der Kinder eines Verzeichnisknotens (also die Anzahl der Sub-Dirs) mit [c]0[/c] zurückliefern und gleichzeitig einen anderen Thread anstoßen der das Dateisystem ausliest. Wenn die Ergebnisse der Abfrage vorliegen werden sie synchron zum EDT in einen Cache eingetragen und die Zuhörer über hinzugefügte Knoten benachrichtigt. Ein ähnliches Beispiel ist die (normale) ListModel-Implementierung des JFileChooser; [c]javax.swing.plaf.basic.BasicDirectoryModel[/c].

Ob ein Modell selbständig multi-threaded arbeitet und synchronisiert, oder ob es von außen herbeigeführte Statusänderungen selber zum EDT synchronisiert, oder ob es das Problem allen anderen überlässt hängt maßgeblich vom jeweiligen Zweck der Modellimplementierung ab.

Ebenius
 

Marco13

Top Contributor
Ich stimme dir da so weit zu, dass ich befürchte, dass meine Aussage vielleicht falsch interpretiert wurde ;)

Ich wollte andeuten, dass man nicht pauschal sowas machen sollte wie
Java:
class SimpleListModel implements ListModel
{
    private List data;
    private List listeners = ...

    public void addElement(Object element)
    {
        data.add(element);

        SwingUtilities.invokeLater(new Runnable() // DAS HIER NICHT!
        {
            public void run() 
            {
                for (ListDataListener listener : listeners) listener.contentsChanged(...);
            }
        });
    }

}
sondern stattdessen
Java:
    /** ... only call this on EDT... */
    public void addElement(Object element)
    {
        data.add(element);
        for (ListDataListener listener : listeners) listener.contentsChanged(...);
    }

Außer wenn man schreiben will
Java:
    /** ... this is thread-safe.... */
    public void addElement(Object element)
    {
        // So wie im ersten Beispiel, ggf. noch mit einer "...isEventDispatchThread()" Abfrage...
    }
 

Ebenius

Top Contributor
Ich stimme dir da so weit zu, dass ich befürchte, dass meine Aussage vielleicht falsch interpretiert wurde ;)
Oder ich zuvor. :)

Ich wollte andeuten, dass man nicht pauschal sowas machen sollte wie [...]
Stimme zu. Wenn, dann muss Zeile 8 auch noch 6 Zeilen runter! Ansonsten ist das Modell zu seinen Nachrichten inkonsistent. Außerdem sollte man in diesem Fall nicht [c]invokeLater()[/c] benutzen, sonden Fallunterscheidung: Wenn auf dem EDT, dann direkt ausführen + Nachrichten schicken, anderenfalls mit die Methode selbst nochmals mit [c]invokeAndWait()[/c] aufrufen.

Ebenius
 

roxX0r

Mitglied
danke für die vielen Anwtorten, ich werde mein Modell jetzt mal überprüfung, ob es dort kritische Stellen gibt. Ich habe meistens nur irgendwelche JTable Models, die im EDT definiert sind und auf die ich dann über andere Threads zugreife, um dort neue Zeilen hinzuzufügen. Oder ich setze ein neues Textelement im EDT über einen anderen Thread.

Werde sicherlich hier nochmal was posten, wenn ich das verstanden hab, was ihr hier alle schreibt und ich meinen Code dann überprüft hab :)


Nur noch eine Frage schonmal vorweg: Nehmen wir mal an mein Code hat solche Schwachstellen, kann das der Grund sein, wieso sich die JVM (sehr sehr unregelmäßig) verabschiedet und im Errorlog dann die comctl32.dll als Bösewicht genannt wird? Diese DLL zeichnet wohl Oberflächen Elemente, könnte also schon was mit Swing zu tun haben?
 

Wildcard

Top Contributor
Der Fehler liegt in diesem Beispiel übrigens in einem dieser beiden Punkte. Entweder ist das Modell nicht Thread-save; dann darf kein Background-Thread das Modell verändern. Oder das Modell ist Thread-save, dann muss es die Listener über den EDT benachrichtigen.

Ebenius
Da muss ich energisch widersprechen :)
Dein Datenmodell ist der Kern, die Heilige Kuh deiner Anwendung. Du willst keinesfalls das dein Modell so etwas wie den EDT überhaupt kennt. Was ist wenn dein Modell headless verwendet wird? Was ist wenn dein Modell plötzlich eine SWT oder Web-Anwendung speisen soll?
Ein Modell kennt keine View, der Adapter/Controler der Modell mit View verknüpft muss sich um UI spezifisches threading kümmern, nicht das Modell.
Du beziehst dich später auf Swing Modelle (TableModel, ListModel,...). Diese Modelle sind in meinen Augen ein konzeptioneller Fehler in Swing, aber da muss man mit leben...
Diese Modelle sollten jedoch nicht das Business-Modell deiner Anwendung bilden da sie Toolkit spezifisch sind. Das Business Modell wird entweder in ein Swing Modell überführt, oder darauf adaptiert. In letzterem Fall ist dann diese Adapter Schicht dafür zuständig die Change Events Swing spezifisch aufzuarbeiten und das threading zu regeln, nicht das Business Modell
 

Marco13

Top Contributor
Ja, darauf wollte ich eigentlich auch raus - aber ob die Swing Modelle nun ein konzeptieller Fehler sind? Man kann ja (wie schon angedeutet) einfach postulieren, dass sowas wie ein TableModel (wenn es in einer JTable verwendet wird - was ja nicht notwendigerweise aber üblicherweise der Fall ist) eben nur über den EDT verändert werden darf, genauso wie man bei seinen "Business-Modellen" beliebige Threadanforderungen stellen darf... Also, man verwendet die Swing-Modelle ja nicht direkt als Business-Modelle, von daher wäre da eine Implementierung, die Events auf dem EDT feuert, ja OK...
 

Wildcard

Top Contributor
Ja, darauf wollte ich eigentlich auch raus - aber ob die Swing Modelle nun ein konzeptieller Fehler sind?
Swing legt es nahe Daten in designierte Swing Modelle zu packen weil die Interfaces zu komplex sind um sie immer selbst passend zu implementieren. Sobald man allerdings Daten in Swing Modelle packt muss man zwischen Domain Modell und Swing Modell synchronisieren und belegt mehr Speicher.
Nach einer Umgewöhnungsphase empfinde ich den JFace Ansatz als den sinnigeren, MVA statt MVC.
Viewer arbeiten generisch auf einem Modell vom Typ Object und treffen keine weiteren Annahmen über den Inhalt. Der Inhalt wird nach dem Pull Prinzip aus dem Object extrahiert mit einem jeweils passenden Adapter für das Modell (ContentProvider). Das Rendering geschieht analog in einem LabelProvider.
Der Vorteil ist, die Interfaces sind sehr schmal, man benötigt keine Zwischenmodelle, es wird nur wenig Speicher benötigt, die Einzelteile sind wiederverwendbar, der Code ist sauber entkoppelt und flexibel
 

Ebenius

Top Contributor
Da muss ich energisch widersprechen :)
Re. :)

Du beziehst dich später auf Swing Modelle (TableModel, ListModel,...).
Nur um das klarzustellen: Ich bezog mich die ganze Zeit auf Swing und natürlich Modelle im Zusammenhang mit Swing. Vielleicht hab ich irgendwas im Thema oben verpasst, aber dem Themeneröffner geht es doch explizit um Swing. Vielleicht hätte ich hier deutlicher auf Swing-Komponentenmodelle hinweisen sollen.

Allgemeiner gesehen beziehe ich mich auf Modelle im MVC-Kontext. Die Bezeichnung "Business Modell" finde ich unschön. Soweit ich weiß bezeichnet man im MVC das Modell bewusst als Datenmodell. Darüber hinaus ist die Bezeichnung "das Modell" (gern auch "das Datenmodell") ohne weitere Einschränkung ohnehin schwer zu deuten. Betrachtet man eine gesamte GUI-Anwendung, bezeichnet "das Datenmodell" jedwede Datenhaltung und gewisse Geschäftslogik.

Ein Komponentenmodell wie in Swing -- ob es nun als Instanz Daten selbst hält oder transient auf andere Modellbausteine eine spezielle Sicht bildet spielt keine Rolle -- gehört zum Datenmodell. Es hat den Zweck einer bestimmten Art Präsentation in einem bestimmten Kontext Daten mundgerecht zur Verfügung zu stellen. Ein solches Modell kann sich darauf verlassen, nicht Headless zu laufen, da es ohne GUI jedweder Existenzgrundlage beraubt ist. Ein Komponentenmodell muss alle von der Komponente gestellten Anforderungen erfüllen.

Wenn Threading hierbei ein Thema ist, dann muss sich das Komponentenmodell eben darum kümmern. Selbst wenn eine extra Adapterklasse (MVC, nicht MVA!) zwischen einem Modellbaustein und einem Komponentenmodell hängt, zwischen beiden Daten transferiert und sich um das UI-spezifische Threading kümmert, gerhört dieser Adapter im MVC zum Datenmodell und nicht etwa zum Controller.

Ein Modell kennt keine View, der Adapter/Controler der Modell mit View verknüpft muss sich um UI spezifisches threading kümmern, nicht das Modell.
Hier hast Du glaub ich was vermischt. In MVA kennt eine View das Modell nicht. Es greift per Adapter auf Daten des Datenmodells zu. Der Adapter hätte die Möglichkeit Daten aus dem Modell aufzubereiten. In MVC schaut die View direkt aufs Modell; der Controller kann sich überhaupt nicht um UI-spezifisches Threading für die Datenschnittstelle der View kümmern! Der Controller hat den einzigen Zweck, Eingaben aus der View entgegen zu nehmen und (ohne weiter aufs Detail einzugehen) zu verarbeiten. Ein Controller ist nicht dafür zuständig Daten zu manipulieren, übersetzen, etc.

Ich lasse mich gern eines Besseren belehren, dann aber bitte mit Quellenangabe. :)

Swing legt es nahe Daten in designierte Swing Modelle zu packen weil die Interfaces zu komplex sind um sie immer selbst passend zu implementieren. Sobald man allerdings Daten in Swing Modelle packt muss man zwischen Domain Modell und Swing Modell synchronisieren und belegt mehr Speicher.
Das sehe ich nicht so. Ich baue häufiger eigene Swing-Modelle und die Modelle finde ich in der Regel nicht zu kompliziert. Ich mag die Swing-Modelle, aber diese Diskussion ist ein Glaubenskrieg, also verzichte ich hier mal drauf. :-D

Ebenius
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Nur so nebenbei: beim modifizierten MVC steht der Kontroller zwischen View und Model, wodurch eine bessere Trennung zwischen View und Model erreicht wird. Der Kontroller übersetzt Benutzeraktionen in Aktionen, die das Model auszuführen hat. Zudem informiert der Kontroller die View über Änderungen im Model.
 

Wildcard

Top Contributor
Ein Komponentenmodell wie in Swing -- ob es nun als Instanz Daten selbst hält oder transient auf andere Modellbausteine eine spezielle Sicht bildet spielt keine Rolle -- gehört zum Datenmodell. Es hat den Zweck einer bestimmten Art Präsentation in einem bestimmten Kontext Daten mundgerecht zur Verfügung zu stellen. Ein solches Modell kann sich darauf verlassen, nicht Headless zu laufen, da es ohne GUI jedweder Existenzgrundlage beraubt ist. Ein Komponentenmodell muss alle von der Komponente gestellten Anforderungen erfüllen.
Wenn Threading hierbei ein Thema ist, dann muss sich das Komponentenmodell eben darum kümmern. Selbst wenn eine extra Adapterklasse (MVC, nicht MVA!) zwischen einem Modellbaustein und einem Komponentenmodell hängt, zwischen beiden Daten transferiert und sich um das UI-spezifische Threading kümmert, gerhört dieser Adapter im MVC zum Datenmodell und nicht etwa zum Controller.
Ich Quote mal Wikipedia zum Thema MVC:
Model–View–Controller (MVC) is an architectural pattern used in software engineering. The pattern isolates "domain logic" (the application logic for the user), from input and presentation (GUI), permitting independent development, testing and maintenance of each.

Wenn das Modell dafür zuständig ist notifications in einen GUI Thread zu verschieben, dann ist Modell automatisch an ein spezifisches UI Toolkit gebunden und genau das versucht man mit MVC doch zu verhindern.

Hier hast Du glaub ich was vermischt. In MVA kennt eine View das Modell nicht. Es greift per Adapter auf Daten des Datenmodells zu. Der Adapter hätte die Möglichkeit Daten aus dem Modell aufzubereiten. In MVC schaut die View direkt aufs Modell; der Controller kann sich überhaupt nicht um UI-spezifisches Threading für die Datenschnittstelle der View kümmern!
In der Variante das die View direkt als Observer auf dem Modell liegt muss sich die View darum kümmern das die Benachrichtigung aus einem anderen Thread kommen kann, denn das Modell darf keine Annahme über die Art wie es angezeigt wird treffen.
In Swing ist übrigens die View kein Listener auf dem Modell, denn die View sind nur die Renderer.

Vielleicht haben wir einfach andere Begriffsdefinitionen vor Augen. Für mich ist das Modell der Business/Domain Zustand der Anwendung. Sei es selbst geschrieben, mit EMF, JaxB, oder UML Tools generiert, in jedem Fall aber völlig UI unabhängig. Ob Swing oder ein anderes Toolkit dann noch eine art derived model benötigt um diese Daten dazustellen steht auf einem anderen Blatt, aber in einer Anwendung würde ein Backgroundthread meiner Meinung nach nicht das intermediate Swing Model verändern, sondern die Business Daten, das 'headless' Model. Dein Glue Code/UI Binding muss diese Daten dann toolkitspezifisch aufbereiten.
Das sehe ich nicht so. Ich baue häufiger eigene Swing-Modelle und die Modelle finde ich in der Regel nicht zu kompliziert. Ich mag die Swing-Modelle, aber diese Diskussion ist ein Glaubenskrieg, also verzichte ich hier mal drauf.
Richtig, lassen wir das lieber :)
 

André Uhres

Top Contributor
Nehmen wir mal an mein Code hat solche Schwachstellen, kann das der Grund sein, wieso sich die JVM (sehr sehr unregelmäßig) verabschiedet
Theoretisch könnte es ja auch ein OS oder JVM Problem sein. Daher mein obiger Vorschlag, erstmal die aktuelle JVM von Sun zu installieren. Vielleicht könnte man zuerst auch noch festhalten, bei welchen OS/JVM Versionen das Problem auftritt und bei welchen nicht.
 
U

user124

Gast
vielleicht ein wenig ot aber ein einfaches awt-beispielprogramm hat es reproduzierbar geschafft meinen x-server zu zerschießen - beim vergrößern/verkleinern des fensters mit der maus -> grafikchaos auf dem desktop bis zum kompletten lock.

abhilfe schaffte den nvidia-treiber zu updaten. evtl wäre es interressant zu wissen welche grafikkarten die user benutzen bei denen das problem auftritt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Label auf Hauptfenster manipulieren AWT, Swing, JavaFX & SWT 2
T Bild aufteilen/manipulieren AWT, Swing, JavaFX & SWT 3
G Zeile in JTable durch rechte Maustaste manipulieren AWT, Swing, JavaFX & SWT 4
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
K SWT Mousecursor manipulieren AWT, Swing, JavaFX & SWT 2
R Bild einlesen und manipulieren AWT, Swing, JavaFX & SWT 3
S Bei SWT den Windows beenden Button manipulieren? AWT, Swing, JavaFX & SWT 4
A Tooltips manipulieren? AWT, Swing, JavaFX & SWT 6
R JScrollPane die ScrollBar manipulieren ? AWT, Swing, JavaFX & SWT 3
C Image-Pixel manipulieren AWT, Swing, JavaFX & SWT 9
G Tabulatorreihenfolge manipulieren AWT, Swing, JavaFX & SWT 3
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
J splitpane - Wechseln auf anderen Split erkennen AWT, Swing, JavaFX & SWT 11
N JavaFX applikation auf anderen Systemen zum laufen bringen AWT, Swing, JavaFX & SWT 7
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
B Slider-Wert an anderen Slider übergeben AWT, Swing, JavaFX & SWT 5
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
D JavaFX Ein Parameter von einem Stage(GUI) zu einem anderen übergeben AWT, Swing, JavaFX & SWT 6
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
I JavaFX-Scene-Überlagerung/Wechsel mit pausieren der anderen Scene AWT, Swing, JavaFX & SWT 0
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
B Swing GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 4
N was kann bzw was ist neu an JavaFx was die anderen nicht können AWT, Swing, JavaFX & SWT 2
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
M Gui in einer anderen Java Klasse aufrufen AWT, Swing, JavaFX & SWT 1
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
D Nächste GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 7
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
M Von einem Fenster zum anderen AWT, Swing, JavaFX & SWT 12
B Swing JMenu zwischen anderen Componenten AWT, Swing, JavaFX & SWT 4
Z Swing Text aus JTextField einer anderen Klasse AWT, Swing, JavaFX & SWT 14
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
T JTabbedPane - neuen Tab zwischen zwei anderen Tabs hinzufügen AWT, Swing, JavaFX & SWT 2
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
A AWT Auto aus einer anderen Klasse her neu zeichnen AWT, Swing, JavaFX & SWT 7
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
F Panels über buttons zu anderen Panels hinzufügen AWT, Swing, JavaFX & SWT 2
L SWT Text SelectionText ersetzen durch anderen String AWT, Swing, JavaFX & SWT 6
S Von einer anderen Klasse auf JTextField zugreifen AWT, Swing, JavaFX & SWT 13
P AWT Wie kann mein listener den Inhalt eines anderen Textfelds ändern? AWT, Swing, JavaFX & SWT 10
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
D JComboBox jedes Item mit einer anderen Farbe AWT, Swing, JavaFX & SWT 10
P Von einer anderen Klasse auf JTextField zugreifen AWT, Swing, JavaFX & SWT 12
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3
P Swing JTabbedPane mit JButton einen anderen Tab anzeigen AWT, Swing, JavaFX & SWT 9
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
M Swing Methode in einem Fenster aus einem anderen Fenster aufrufen AWT, Swing, JavaFX & SWT 4
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
Q Swing Panel aus anderen Frame aufrufen AWT, Swing, JavaFX & SWT 2
L Swing Kommunikation zwischen JMenuBar und anderen Componenten AWT, Swing, JavaFX & SWT 2
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
W Mouseclicks werden bei Verwendung anderen Betriebssystems nicht problemlos angenommen AWT, Swing, JavaFX & SWT 3
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
S [ANT] jsch jar aus einem anderen Ordner laden AWT, Swing, JavaFX & SWT 7
G JTabbedPane wird groesser wenn man anderen Tab auswaehlt. AWT, Swing, JavaFX & SWT 2
I Öffnen von anderen Programmen bei Betätigen eines Buttons AWT, Swing, JavaFX & SWT 19
G TableModel mit anderen Spalten AWT, Swing, JavaFX & SWT 4
E JFrame Componente aus einer anderen klasse disposen AWT, Swing, JavaFX & SWT 3
G SystemTray BubbleInfo an anderen Componenten anzeigen AWT, Swing, JavaFX & SWT 6
S Class in einer anderen Class ausführen? AWT, Swing, JavaFX & SWT 5
J JInternalFrame überlagert/unterlagert anderen Elementen AWT, Swing, JavaFX & SWT 2
X Wie passt JIternalFrame sich den anderen Fenstern an? AWT, Swing, JavaFX & SWT 3
G JTree -- Node nach ändern in anderen Knoten AWT, Swing, JavaFX & SWT 15
M Wert von einem Fenster zum anderen übergeben AWT, Swing, JavaFX & SWT 3
G Auf markierten Text einer anderen Anwendung zugreifen. AWT, Swing, JavaFX & SWT 8
N Image Array einer anderen Klasse bearbeiten AWT, Swing, JavaFX & SWT 2
L wie den Cursor von einem TextFeld zum anderen setzen? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben