requestFocus() nach modalem Dialog

Tecwan

Aktives Mitglied
Hallo, folgendes Problem:

Ich habe ein JFrame mit einem TextArea, in dem Eingaben erwartet werden und das daher den
Focus erhalten soll.

Wenn ich über ein Menü einen modalen JDialog aufrufe

Java:
jMenuMenuSelected(){
    aDlg.setVisible(true);
    //Dialog wird angezeigt, Interaktion erfolgt
    //Dialog wird mit aDlg.setVisible(false) geschlossen
    textArea.requestFocusInWindow();
}

und nach dessen Schließen dem TextArea den Focus (zurück) zu geben versuche, erscheint
der blinkende Cursor nicht, und Texteingaben mittels Tastatur werden ebenfalls nicht angenommen.

Erst wenn ich mit der Maus an beliebiger Stelle im Frame klicke, wird der Cursor sichtbar und
Tastatureingaben landen im TextArea.
Das Frame ist allerdings bereits vor dem Klick das aktive Fenster, wie an der Färbung des Rahmens
erkennbar ist - und andere Fenster existieren zu dem Zeitpunkt nicht.
Das Problem tritt nur nach Aufruf des modalen Dialogs auf; zu anderen Zeitpunkten erhält das
TextArea problemlos den Focus.

Gelöst werden kann das Problem zwar mit Einrichtung eines WindowFocusListener:
Java:
public class aFrame extends javax.swing.JFrame implements WindowFocusListener {

    public aFrame() {
        addWindowFocusListener(this);
	//...
    }
	
    public void windowGainedFocus(WindowEvent e) {
        textArea.requestFocusInWindow();
	//plus einigen Overhead, weil das textArea nicht jedesmal den Focus erhalten soll
    }
    
    public void windowLostFocus(WindowEvent e) {}
}

Aber: schön ist das nicht, auch die Alternative über einen KeyListener nicht.

Alternativen?
 
Warum nicht einfach requestFocus() statt requestFocusInWindow()?

Bei mir funktioniert das ganze. Nutzt Du ein bestimmtes LookAndFeel?
Funktioniert das bei Dir:
Java:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTextField field = new JTextField();
frame.add(new JTextField(), BorderLayout.NORTH);
frame.add(field, BorderLayout.SOUTH);
frame.setBounds(0, 0, 200, 200);
frame.setVisible(true);

JDialog dia = new JDialog(frame, true);
dia.setVisible(true);

field.requestFocusInWindow();
 
Warum nicht einfach requestFocus() statt requestFocusInWindow()?

requestFocus() führt bei mir zum gleichen (Miss-)Verhalten.
Warum ich requestFocusInWindow() verwende? Gute Frage, kA, liegt im Dunkel der Vergangenheit...
Ich glaube, weil es einen boolschen Rückgabewert gibt (der aber in allen Fällen false ist).

Der Beispielcode funktioniert; nach Schließen des Dialogs erhält das "südliche" TextField Focus
und Cursor.

LookAndFeel ist "Windows", das Frame wird vom GUIEditor mit NetBeans gebastelt.
Ich mache mich mal auf die Suche, ob evtl. anderer Code zwischenschießt (ich habe da ein
Hintergrundbild liegen, evtl. gibt das Probleme).

EDIT: Das Hintergrundbild ist es nicht.
 
Zuletzt bearbeitet:
Fehlerquelle gefunden.

Ich habe den
Code:
jDialog
direkt, also ohne Umweg über ein Popup-
Code:
jMenuItem
aus dem
Code:
jMenu
aufgerufen. Nachdem ich in das
Code:
jMenü
ein
Code:
jMenuItem
zum Aufruf eingesetzt habe, trat das Problem nicht mehr auf.

Jetzt brauche ich eben bei der Menüauswahl einen Klick mehr - oder muss einen Tastatur-shortcut
nutzen, wenn ich keinen
Code:
WindowFocusListener
benutzen möchte. Aber was solls, jetzt
funktioniert es so, wie es der Nutzer auch erwartet: es tut sich nicht schon gleich etwas, wenn nur
der Hauptpunkt der Menüleiste angeklickt wird.

Ein weiteres Beispiel, dass Java sich nicht immer ganz so verhält wie es sollte (oder man erwartet),
sobald man sich ein kleines Stück vom Pfad der Tugend entfernt.
 

Zurück
Oben