Focus-Handler
Thorsten
- java
0 Martin Jung0 Thorsten
Hallo Forum,
ich habe eine JList, der ich einen Focus-Lost Handler übergeben habe.
Das heitß, daß, sobald auf eine andere Komponente innerhalb meiner GUI-Applikation geklickt wird, die JList ihren Focus verliert.
Und jetzt das Problem:
Gleichzeitig möchte ich realisieren, daß markierte Elmente in der JList über Buttons editiert sowie gelöscht werden können. Diese Buttons sollen nur enabled sein, wenn die JListe den Focus hat, sobald sie sie verliert, werden auch die Buttons disabled. Das verträgt sich aber nicht mit den Buttons, denn sobald ich auf einen Button klicke, verliert die JList ihren Focus und auch die Buttons werden disabled. -> Die Funkton kann dann nicht mehr ausgeführt werden, der Button bleibt hängen.
Ich möchte das Problem überbrücken, indem ich eine Abfrage schalte, welche Komponente nach der JList den Focus erhält. Kann man das irgendwo abfangen? Welche Befehle gibt es hierzu?
Grüße
Thorsten
Hi Thorsten,
Ich möchte das Problem überbrücken, indem ich eine Abfrage schalte, welche Komponente nach der JList den Focus erhält. Kann man das irgendwo abfangen? Welche Befehle gibt es hierzu?
Sorum würde ich das nicht machen, denn Du müsstest ja jedesmal über alle Objekte des Parent Containers iterieren und mit if (JComponent.hasFocus()) abfragen. Das geht schnell zu Lasten der Performanz, die bei Swing sowieso nicht besonders berauschend ist.
Ich würde Deine Buttons vielmehr der JList eine Nchricht schicken, sich den Focus zu holen.
Auf die Schnelle fallen mir zwei Möglichkeiten ein.
Alle aufgeführten Methoden sind von JComponent.
JList: Deine JList
JButton: Dein Button.
Es folgt Pseudo-code:
Jlist.setRequestFocusEnabled(true);
// realisert durch einen ActionListener
If (Button.isClicked){
JList.requestFocus();
}
oder:
JButton.setNextFocusableElement(JList);
Ausprobiert habe ich das jetzt natürlich nicht.
Grüße,
Martin
(JComponent.hasFocus())
Wenn Du mir damit sagen willst, daß man den Focus mit hasFocus() abfragen kann,dann werde ich auf der Stelle tiiiiiiiiiief in den Boden versinken,: vor Scham und Ehrfurcht.
*gleichmalausprobierengehobsklappt*
Merci beaucoup
Thorsten
Hi MArtin,
ich habe das PRoblem jetzt anders gelöst. Nicht allzu umständlich, da ich ja nur 4 Buttons habe, die beim Focus achtgeben müssen:
Bei onover wird eine Varíable auf 0 gesetzt, bei onmouseout wird sie auf 1 gesetzt.
Ist die Variable 0, wird dem FocusListener von der Jlist verboten die Buttons auf disabled zus etzen, wenn die Variable auf 1 steht darf der FocusListener machen was er will.
Erinnert stark an JavaScript, was?!
Was hältst Du von der Lösung? Ist sie unsauber? Ich sah keinen anderen Weg mehr.
Grüße
Thorsten
Hi,
Ist die Variable 0, wird dem FocusListener von der Jlist verboten die Buttons auf disabled zus etzen, wenn die Variable auf 1 steht darf der FocusListener machen was er will.
Erinnert stark an JavaScript, was?!
Was hältst Du von der Lösung? Ist sie unsauber? Ich sah keinen anderen Weg mehr.
Ohne den Quellcode zu sehen, kann man das kaum realistisch beurteilen.
Bzgl. der Frage nach "Sauberkeit" bin ich vielleicht noch nicht lange genug im Java-Geschäft (3 Monate).
Ich glaube aber, "Eleganz" bzw. "Objekt-Orientiertheit" wären wohl eher passende Dimensionen einer Beurteilung.
Im Prinzip klingt das alles ok. Es riecht allerdings nach statischen Zählervariablen. Solche statischen Dinge versuche ich zu vermeiden, wo immer es geht. Das hat zunächst aber seinen Hintergrund darin, dass ich das OO-Prinzip verinnerlichen möchte (Kapselung etc.).
Wenn es funktiniert, reicht das ja fürs Erste - über Alternativen kann man in späteren Releases immer noch nachdenken.
Grüße,
Martin
Das hat zunächst aber seinen Hintergrund darin, dass ich das OO-Prinzip verinnerlichen möchte (Kapselung etc.).
Da hast Du recht, mir geht das genauso. Aus diesem Grund sei Anfängern zu empfehlen, keinen Editor ala JBuilder zu nutzen, bei dem Objektorientiertheit so gut wie verloren gehjt (sprich: Einfügen von Funktionen wo's nur geht). Bis man das Konzept der OO-Programmierung kennt, sollte man von Editoren die Finger lassen, und selber hardcodieren was das Zeug hält.
Meiner einer macht das mit UltraEdit, es gibt einfach keinen besseren Editor...
in diesem Sinne
happy hacking
Thorsten
Das hat zunächst aber seinen Hintergrund darin, dass ich das OO-Prinzip verinnerlichen möchte (Kapselung etc.).
Meiner einer macht das mit UltraEdit, es gibt einfach keinen besseren Editor...
Allaire Kawa??
Grüße,
Martin
Meiner einer macht das mit UltraEdit, es gibt einfach keinen besseren Editor...
Allaire Kawa??
EditPlus? (http://www.editplus.com/)
;-)))
MfG Simon
Hi!
EditPlus? (http://www.editplus.com/)
;-)))
Wieso das Augenzwinkern?
Ach weißt Du, ich hab schon so oft versucht, das Teil an den Mann (die Frau) zu bringen, aber es hört ja keiner auf mich :-)
Ist wirklich ein genialer Editor und außerdem hat er so gut in die Liste gepasst :-)
MfG Simon
Hi,
Ach weißt Du, ich hab schon so oft versucht, das Teil an den Mann (die Frau) zu bringen, aber es hört ja keiner auf mich :-)
Ist wirklich ein genialer Editor und außerdem hat er so gut in die Liste gepasst :-)
Ach so. Ihn verwende ich für die JSPs.
Kawa ist halt der Standard in unserem Laden.
Grüße,
Martin
Hi!
Ich versuche das Ganze mal mit dem FocusListener (http://java.sun.com/j2se/1.3/docs/api/java/awt/event/FocusListener.html). Es kommt darauf an, in welcher Reihenfolge die Events aufgerufen werden. Wird zuerst JList.focusLost() aufgerufen und dann JButton.focusGained(), dann müsste es funktionieren, indem die Liste die Buttons disabled und die Buttons sich selbst wieder enablen:
JList liste = new JList(...);
JButton edit = new JButton(...);
JButton del = new JButton(...);
liste.addFocusListener( new FocusListener()
{
public void focusLost(FocusEvent e)
{
edit.setEnabled(false);
del...
}
public void focusGained(FocusEvent e) { /*Nix zu tun*/ }
});
edit.addFocusListener( new FocusListener()
{
public void focusLost(FocusEvent e) { /*Nix zu tun*/ }
public void focusGained(FocusEvent e)
{
edit.setEnabled(true);
del...
//evtl. hier auf Event reagieren, falls der ActionListener durch das disablen "hängenbleibt"
}
});
edit.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//auf Event reagieren
}
});
//das gleiche noch mal für Button "del"
Sollte das nicht funktionieren (z.B. weil der Button, wenn er disabled wird, sein focusGained() unterdrückt), dann müsstest Du das so regeln, dass alle Komponenten, die den Fokus bekommen können, die Buttons disablen (außer die Buttons selbst):
JComponent anderekomponente = new JComponent(...);
anderekomponente.addFocusListener( new FocusListener()
{
public void focusLost(FocusEvent e) { /*Nix zu tun*/ }
public void focusGained(FocusEvent e)
{
edit.setEnabled(false);
del...
}
});
Das ist aber natürlich nicht sehr bequem (vor allem, weil auch das Fenster den Fokus verlieren kann!).
Das Dumme daran ist, dass die Liste nicht herausfinden kann, an wen sie den Focus verloren hat - es sei denn, button.hasFocus() liefert schon true, wenn liste.focusLost() aufgerufen wird.
Aber da musst Du wohl ein bißchen rumprobieren... :-)
MfG Simon