Frame reagiert nicht mehr auf maus

hallo miteinander,

folgendes problem:

von meinem programm aus rufe ich mehrere frames auf.

JFrame frm = new JFrame();
frm.setSize(…);
frm.setVisible(true);

jetzt passiert es des öfteren, das eines der frames nicht mehr auf maus-aktivitäten reagiert - d.h. weder die standard-funktionen wie verschieben,schliessen,… noch componenten wie textfield, buttons oder table lassen sich mit der maus aktivieren.
sie reagieren allerdings noch auf die tastatur( tab, space,…).

ach übrigens ich arbeite mit jbuilder4 foundation

kennt jemand dieses problem?
und gibt es eine lösung dafür ?

mfg
markus

Moin

kennt jemand dieses problem?

JO

und gibt es eine lösung dafür ?

JO/Nö:

Es gibt 2 mögliche Gründe:

  1. der garbage collector macht Überstunden, dagegen gibt es in java kein Mittel (is aber eher unwahrscheinlich)

  2. Das Graphic-Thread-Problem:

Ich nemme an du kannst mit Threads umgehen ? (wenn nicht poste nochmal)

In der JVM läuft ein Thread der sich noch um die „Graphic“ kümmert, also z.b. sicherstellt dass Button reagieren, fenster sich schliessen,… also das ganze GUI.

In diesem Thread werden auch alle events abgearbeitet. Wenn also bei der Abarbeitung eines Event (z.b. ein Klick auf den Button „finde Primzahl“…) ein sehr lange Rechnung angestossen wird blockiert das den Graphic-Thread.
=> das GUI blockiert, die Fenster frieren ein.

codebeispiel:
public void actionPerformed(ActionEvent e) {
//Ab hier steht die Graphik

// rausfinden welches Event…
PrimBerechnen (x,y,z); //Das dauert „zu lange“

//Ab hier ist wieder alles normal
}

Lösung:
du musst alle rechenintensiven Aufgaben als einzelne Threads implementieren und diese bei der eventabarbeitung starten.
z.b.

class XYZ extends Thread

public XYZ (x,y,z){ //init und Variablen übergeben, nichts Berrechnen.
}

public void run (){
PrimBerechnen (x,y,z); //Das blockiert nur diesen Thread, keine anderen (wichtige).
}


public void actionPerformed(ActionEvent e) {
//Ab hier steht die Graphik

// rausfinden welches Event…
Thread T = new XYZ (x,y,z);
T.start () // NICHT run();, dieser Aufruf blockiert nicht.
//Ab hier ist wieder alles normal
}

Will man die Graphic flüssig halten darf man diesen Thread auf _keinen_ Fall durch „schwere“ Aufgaben blockieren.

hat’s geholfen ?