Question

J'écris une application Java (GUI Swing) qui apparaît périodiquement un JFrame.

Est-il possible en quelque sorte d'amener la fenêtre à l'avant (foo.setAlwaysOnTop (vrai) serait encore mieux) mais sans ayant le focus?

Certaines personnes se déplacent les yeux de l'écran de temps en temps de regarder leur clavier lors de la frappe, et je suis sûr que si cette fenêtre était toujours capturer les gens focus clavier obtiendraient vraiment ennuyé comme ça leur a fait perdre tout à fait quelques frappes à chaque fois qu'il apparaît inaperçu.

Dans d'autres cas, même lorsque l'utilisateur est réellement capable de taper sans regarder le clavier tout le temps, ayant une fenêtre pop-up et obtenir accent pourrait provoquer des actions non désirées dans la fenêtre pop-up lui-même (une combinaison de Tab + de Enter par exemple, lorsque l'utilisateur sélectionne accidentellement une option qu'elle a vraiment n'avait choisi autrement).

Merci à l'avance!

Mise à jour

Comme Jonas suggère, foo.setFocusableWindowState(false); semble fonctionner si elle est appelée après la fenêtre a été rendu (testé sur Gnome uniquement).

Cela ne fonctionne pas:

foo.setFocusableWindowState(false);
foo.setVisible(true);
foo.setFocusableWindowState(true);

Cependant, cette fait :

foo.setFocusableWindowState(false);
foo.setVisible(true);
Thread.sleep(1000);
foo.setFocusableWindowState(true);

Je vais devoir voir s'il y a un événement que je peux attraper / écouter qui me permet de faire foo.setFocusableWindowStatue(true); le cas échéant.

Je considère mon problème résolu.

Était-ce utile?

La solution

Cela peut fonctionner:

foo.setFocusableWindowState(false);

Autres conseils

de Java 1.7, vous pouvez appeler

frame.setAutoRequestFocus(false);

J'ai récemment rencontré le même problème, et la solution provisoire a été:

JFrame frame = ...;
frame.setExtendedState(JFrame.NORMAL);
frame.setAlwaysOnTop(true);
frame.requestFocus();
frame.setAlwaysOnTop(false);

Suggestion: In the GUI Component that creates the Frame, put 2 consecutive calls:

frameJustCreated.requestFocus();
this.requestFocus();

1st one bring the window of the new JFrame to the top, 2nd one keeps the window where the user is typing at the top.

If you want to call setFocusableWindowState(true) in an event (so, not to wait e.g. 1 second), you can add a WindowListener (e.g. derived from WindowAdapter) that changes the property:

    appFrame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowOpened(WindowEvent e) {
            super.windowOpened(e);
            e.getWindow().setFocusableWindowState(true);
        }
    });

    appFrame.setFocusableWindowState(false);
    appFrame.setVisible(true);

JInternalFrame toFront() calls to moveToFront()

Override moveToFront()

public void moveToFront() {
        Window window = SwingUtilities.getWindowAncestor(this);
        Component focusOwner = (window != null) ? window.getFocusOwner() :
                                null;
        boolean descendant = false;

        if (window != null && focusOwner != null &&
                      SwingUtilities.isDescendingFrom(focusOwner, this)) {
            descendant = true;
            requestFocus();
        }

        super.moveToFront();

        if (descendant) {
            focusOwner.requestFocus();
        }
    }

the fix is in moveToFront to check if a child has focus, if it does, then temporarily request focus on the internal frame. After the internal frame has movthe ed to front, then request focus back on the previously focused component. This will ensure the appropriate events are generated.

refer https://bugs.openjdk.java.net/browse/JDK-4309079

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top