Da hier: http://www.java-forum.org/de/viewtopic.php?t=27136&start=90
und speziell da: http://www.javalobby.org/eps/galbraith-swing-2/ diese Foxtrot API angesprochen wird, dachte ich mir, ich verbaue das Teil mal...
Tjo, gesagt getan! Ich habe mir mal einen eigenen Listener (in einem Projekt) gebastelt, denn wenn ich den über eine JComponent lege immer auf Maus und KeyEvents reagiert.
Dort drinnen gibt es eine Methode "invoke" welche den aufgerufen wird, wenn eben einer diese 2 Events auftritt! Um das einfriereren der GUI zu verhinderen dachte ich mir ich baue das gleich bevor ich die invoke Methode aufrufe ein (also foxtrot).
Das sieht ungefähr so aus:
Ich wollte halt, das der Button oder was auch immer disabled wird, die eigentliche Methode (via invoke) ausgeführt (also auf was man im Listener reagiert) und dann die Komponente wieder enablen!
So, das ganze klappt wenn ich vom ersten JFrame ausgehe (der nicht via dem Listener aufgerufen wird).
Klicke ich dann von dem JDialog 1 mit Foxtrot und dem Listener auf nen 2ten JDialog mit Foxtrot und dem Listener so reagiert der Button nicht mehr! Bzw Foxtrot geht nicht mehr, also wenn ich mit debuge geht der irgendwie nicht mehr in diesen Job rein..
Hier ein KSKB!
Bin gerade beim Erstellen des KSKB draufgekommen, das es anscheinend mit dem JDialog und setModal zum tun hat! Wenn die JDialogs nicht modal sind, klappt es einwandfrei.. Nur brauche ich modale Dialoge..
Hier noch wie das Problem aussieht: Klickt man beim JFrame auf den Button so öffnet sich der FDialog! Klickt man hier auf den Button drauf, passiert nix.. (man kann öfters draufklicken um zu testen). Schließt man den FDialog mit dem X so öffnen sich nachher die anderen Dialoge, da dann der modale Dialog nicht mehr blockiert..
Weiß jemand eine Abhilfe?!
Nachtrag: Was mir noch aufgefallen ist, lässt man beim JFrame (Klasse Testor) den foxtrot Weg weg, so kann man einmal einen weiteren Dialog öffnen (also bis Ebene 2). Also scheint dies ein Fehler zwischen der Mischung modaler Dialog und Foxtrot zu sein...
Nachtrag2: Ha, mit ConcurrentWorker klappts doch Man muss halt nur die Doc gscheit durchlesen..
Problem ist halt, das beim ConcurrentWorker andere Beispiele angeschnitten werden! Aber da der Prozess ja bis zum Beenden nicht beendet wird, muss ich den ConcurrentWorker nehmen, da der Worker ja alle hintereinander macht, währen der ConcurrentWorker die auch nebeneinander machen kann! (In der Doc wird da ein Bsp mit Abbruchsmöglichkeiten angeschnitten... und nicht mit modalen JDialogs :bae
Fazit: Foxtrot ist super und man sollte (wenn man asynchronus Threading vermeiden will) auf foxtrot setzen!!
und speziell da: http://www.javalobby.org/eps/galbraith-swing-2/ diese Foxtrot API angesprochen wird, dachte ich mir, ich verbaue das Teil mal...
Tjo, gesagt getan! Ich habe mir mal einen eigenen Listener (in einem Projekt) gebastelt, denn wenn ich den über eine JComponent lege immer auf Maus und KeyEvents reagiert.
Dort drinnen gibt es eine Methode "invoke" welche den aufgerufen wird, wenn eben einer diese 2 Events auftritt! Um das einfriereren der GUI zu verhinderen dachte ich mir ich baue das gleich bevor ich die invoke Methode aufrufe ein (also foxtrot).
Das sieht ungefähr so aus:
Code:
if(pressed)
{
pressed = false;
if(adapter != null)
{
foxtrot.Worker.post(new foxtrot.Job(){
public Object run()
{
component.setEnabled(false); //wenn er nicht enabled wäre, könnte man nicht klicken
adapter.invoke(e);
component.setEnabled(true);
return null;
}
});
}
}
Ich wollte halt, das der Button oder was auch immer disabled wird, die eigentliche Methode (via invoke) ausgeführt (also auf was man im Listener reagiert) und dann die Komponente wieder enablen!
So, das ganze klappt wenn ich vom ersten JFrame ausgehe (der nicht via dem Listener aufgerufen wird).
Klicke ich dann von dem JDialog 1 mit Foxtrot und dem Listener auf nen 2ten JDialog mit Foxtrot und dem Listener so reagiert der Button nicht mehr! Bzw Foxtrot geht nicht mehr, also wenn ich mit debuge geht der irgendwie nicht mehr in diesen Job rein..
Code:
public class Testor extends JFrame
{
private static class FDialog extends JDialog
{
private static int dlgCounter = 1;
public FDialog(int dlgCount, JFrame owner)
{
super(owner, "Dialog " + dlgCount + " Insgesamt: " + dlgCounter, true);
init(dlgCount);
}
public FDialog(int dlgCount, JDialog owner)
{
super(owner, "Dialog " + dlgCount + " Insgesamt: " + dlgCounter, true);
init(dlgCount);
}
private void init(final int dlgCount)
{
final JButton testButton = new JButton("Hit me " + dlgCount);
testButton.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e)
{
foxtrot.Worker.post(new foxtrot.Job(){
public Object run()
{
testButton.setEnabled(false);
FDialog dlg = new FDialog(dlgCount + 1, FDialog.this);
dlg.setVisible(true);
testButton.setEnabled(true);
return null;
}
});
}
});
dlgCounter++;
this.getContentPane().add(testButton);
this.setSize(200 + (dlgCount * 10),200 + (dlgCount * 10));
this.setLocationRelativeTo(getParent());
}
}
public Testor() throws Exception
{
super();
final JButton testButton = new JButton("Hit me");
testButton.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e)
{
foxtrot.Worker.post(new foxtrot.Job(){
public Object run()
{
testButton.setEnabled(false);
FDialog dlg = new FDialog(1, Testor.this);
dlg.setVisible(true);
testButton.setEnabled(true);
return null;
}
});
}
});
this.getContentPane().add(testButton);
this.setSize(300,300);
this.setLocationRelativeTo(getParent());
this.setVisible(true);
public static void main( String[] args ) throws Exception
{
new Testor();
}
}
Hier ein KSKB!
Bin gerade beim Erstellen des KSKB draufgekommen, das es anscheinend mit dem JDialog und setModal zum tun hat! Wenn die JDialogs nicht modal sind, klappt es einwandfrei.. Nur brauche ich modale Dialoge..
Hier noch wie das Problem aussieht: Klickt man beim JFrame auf den Button so öffnet sich der FDialog! Klickt man hier auf den Button drauf, passiert nix.. (man kann öfters draufklicken um zu testen). Schließt man den FDialog mit dem X so öffnen sich nachher die anderen Dialoge, da dann der modale Dialog nicht mehr blockiert..
Weiß jemand eine Abhilfe?!
Nachtrag: Was mir noch aufgefallen ist, lässt man beim JFrame (Klasse Testor) den foxtrot Weg weg, so kann man einmal einen weiteren Dialog öffnen (also bis Ebene 2). Also scheint dies ein Fehler zwischen der Mischung modaler Dialog und Foxtrot zu sein...
Nachtrag2: Ha, mit ConcurrentWorker klappts doch Man muss halt nur die Doc gscheit durchlesen..
Problem ist halt, das beim ConcurrentWorker andere Beispiele angeschnitten werden! Aber da der Prozess ja bis zum Beenden nicht beendet wird, muss ich den ConcurrentWorker nehmen, da der Worker ja alle hintereinander macht, währen der ConcurrentWorker die auch nebeneinander machen kann! (In der Doc wird da ein Bsp mit Abbruchsmöglichkeiten angeschnitten... und nicht mit modalen JDialogs :bae
Fazit: Foxtrot ist super und man sollte (wenn man asynchronus Threading vermeiden will) auf foxtrot setzen!!