Java en plein écran sur Linux - comment couvrir la barre des tâches?

j'ai un problème pour exécuter L'application Java en mode plein écran sur "openSUSE 11.4 (x86_64)". J'utilise Java 1.6.0_26-B03.

j'ai essayé d'exécuter deux exemples d'application Plein écran:

  1. Exemple d'Oracle site: Test Du Mode D'Affichage.
  2. JDarkRoom.jar (simple éditeur de texte) téléchargé à partir de chimistes Codéaux.

dans les deux cas, J'ai une barre de tâches Linux visible sur l'application. Il doit être quelque chose avec les paramètres/la configuration du système?

12
demandé sur Ferdi 2012-01-12 19:35:30

5 réponses

Vous devrait être capable d'aller "vraiment plein écran" avec GraphicsDevice.setFullScreenWindow (window). Cependant, en raison de bogues dans les exécutables Java les plus populaires, cela peut ne pas fonctionner sur les systèmes exécutant certaines versions "cassées" dans la série 1.6 = Java 6. Je n'ai pas testé cela en profondeur, donc il se peut que le patch ne se soit pas propagé à la population générale, encore.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7057287

Arrière-Plan De La Théorie

OK, donc voici pour trop d'informations, et pas assez d'aide... voici un peu de pourquoi cela ne fonctionne pas...

il n'y a pas de Linux Desktop

systèmes D'exploitation basés sur Linux sur des machines de type PC, ainsi que d'autres unités (avec une exception partielle pour MacOSX), normalement, utilisez le système X Window (alias X11). Sous X, vous avez un serveur X (habituellement, quelque chose comme un "pilote vidéo") et clients qui s'y rattachent, le plus souvent, à partir de la même machine (loopback).

la disposition et l'emplacement des fenêtres est contrôlé par un spécial programme client, appelé le Gestionnaire de fenêtres. Il est responsable de la décoration des fenêtres (par exemple, dessin des barres de titre ou des poignées de redimensionnement) et de leur positionnement.

votre programme serait un client X. Il peut demande mais pas demande - placement sur l'écran à une certaine position, ou d'une certaine taille. Divers gestionnaires de fenêtres sont plus (ou moins) enclins à vous donner ce que vous voulez.

excepté, la plupart des ordinateurs de bureau fonctionnent bien(parfois)

maintenant, de loin, la plupart des ordinateurs de bureau Linux utilisent le bureau Gnome, avec une forte deuxième place pour le bureau K, et quelques autres sont assez large utilisation. Ce qui est "sympa" c'est que ces deux environnements de bureau (ainsi que certains autres, comme XFCE pour les PC bas de gamme) se conforment à la FreeDesktop.org Conseils De Gestionnaire De Fenêtres normes.

(Super-simplification:) typiquement, il y aura des panneaux sur un ou plusieurs bords de l'écran. En général, il n'y en a qu'un, en haut, mais il y en a beaucoup les variations. Ces zones de panneau ne sont pas considérées "partie de l'écran," donc le Gestionnaire de fenêtre dit à votre application, " non, c'est en dehors de la zone dans laquelle vous êtes autorisé à jouer; cet écran n'est pas 1920×1080, Il est seulement 1890×1080."Bien sûr, cela pourrait être un arrangement totalement différent de ce que vous aviez prévu lorsque vous avez écrit votre application, et vous pourriez être sur mon netbook avec un écran physique de 800×480 prétendant être seulement 780×480.

Pour 99% des applications, c'est génial. Les fenêtres ne gênent pas les panneaux, vous pouvez donc toujours atteindre le panneau pour les contrôles critiques, comme frapper le muet ou passer à un autre programme ou quelque chose.

ces "indices" vous permettent de demander que vos fenêtres de haut niveau soient traitées spécialement. Par exemple, vous pouvez demander que vous obtenez aucune barre de titre - ou une réduction, "palette" type barre de titre; vous pouvez demander à être sauté sur la liste des fenêtres ou la barre des tâches ou la vue d'ensemble des activités ou n'importe quelle autre interface pourrait être utilisée pour montrer les fenêtres actives; ou, vous pouvez demander à aller vraiment plein écran, et de pousser tout le reste du chemin, et même des panneaux.

La spécification est ici: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

Et l'Échec:

en gros, la spécification de Window manager hints n'a pas été suivie correctement par Sun/Oracle (ou Red Hat, qui a copié Sun/Oracle, ou probablement IBM, parce qu'ils ont probablement fait la même chose, mais je ne vois personne se plaindre d'eux)…

bien que, je ne vois pas certains se plaindre de part et d'autre de savoir si c'est un bug (spécifiquement) avec le gestionnaire de fenêtres de L'environnement de bureau de K (KWin), comme apparemment ce bug n'apparaît qu'en K, et dans Gnome, XFCE, et amis.

Travail

en dehors de la correction de vos exécutables Java (et/ou de ceux de vos clients), la seule vraie solution serait d'utiliser les bibliothèques Java spécifiques à la plate-forme (peut-être les objets AWT sous-jacents en utilisant la réflexion ... eww...) et mettre les bons indices de fenêtre, vous-même.

Oui, c'est dégueulasse...

17
répondu BRPocock 2012-01-12 16:50:46

Juste une précision sur la méthode de bgroenks:

C'est un travail parfait avec java7 et java8 sur Ubuntu 14.10 (Unity).

mais: vous devez définir frame.setResizable(true); sinon, ça ne marchera pas.

attention: le mode plein écran ne fonctionne qu'avec JFrame (pas de JDialog ou JWindow).

Voici un exemple de code: Il prend la place de setVisible(true)

/**
 * @param frame
 * @param doPack
 * @return device.isFullScreenSupported
 */
static public boolean fullScreen(final JFrame frame, boolean doPack) {

    GraphicsDevice device = frame.getGraphicsConfiguration().getDevice();
    boolean result = device.isFullScreenSupported();

    if (result) {
        frame.setUndecorated(true);
        frame.setResizable(true);

        frame.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent arg0) {
                frame.setAlwaysOnTop(true);
            }

            @Override
            public void focusLost(FocusEvent arg0) {
                frame.setAlwaysOnTop(false);
            }
        });

        if (doPack)
            frame.pack();

        device.setFullScreenWindow(frame);
    }
    else {
        frame.setPreferredSize(frame.getGraphicsConfiguration().getBounds().getSize());

        if (doPack)
            frame.pack();

        frame.setResizable(true);

        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        boolean successful = frame.getExtendedState() == Frame.MAXIMIZED_BOTH;

        frame.setVisible(true);

        if (!successful)
            frame.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
    return result;
}

Salutations, Stéphane.

7
répondu smillien62 2014-08-18 11:11:29

je me rends compte que cette question est un peu vieille, mais je suis tombé sur elle à la recherche de la même réponse.

Après beaucoup d'expérimentation, j'ai trouvé une bonne solution:

GraphicsDevice d = GraphicsEnvironment
    .getLocalGraphicsEnvironment().getDefaultScreenDevice();
if (d.isFullScreenSupported()) {
    frame.setUndecorated(true);
    frame.setResizable(false);
    frame.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            frame.setAlwaysOnTop(true);
        }

        @Override
        public void focusLost(FocusEvent arg0) {
            frame.setAlwaysOnTop(false);
        }
    });
    d.setFullScreenWindow(frame);
} else {
    frame.setVisible(true);
}

l'écouteur de focus est donc L'utilisateur peut ALT-TAB ou META-D hors de la fenêtre sans qu'il force immédiatement re-focus.

cela fonctionne sur mon système Linux Mint 15 avec KDE 4. J'utilise aussi un NVIDIA X-Server.

espérons que cela aide! Laissez-moi savoir si cela fonctionne pour vous les gars trop!

6
répondu bgroenks 2013-12-15 21:42:08

rien de ce qui précède n'a fonctionné pour moi, J'utilise XUbuntu, mais j'ai juste essayé D'utiliser un JWindow au lieu d'un JFrame et ça a fonctionné! C'était tellement frustrant, espérons que cela fonctionne pour vous. Oh je devrais mentionner que je n'ai pas encore regardé L'API et je ne suis pas vraiment familier avec la classe JWindow donc je ne suis pas sûr exactement quelles sont les différences entre un JWindow et un JFrame. Bonne chance.

1
répondu Kevin Bigler 2012-11-09 05:26:40

J'ai utilisé les éditions Java 1.6.0_31 et 1.6.0_26 D'Oracle en plein écran mode. J'ai éprouvé certains des problèmes avec la fenêtre ne montrant pas au-dessus de la barre des tâches sur Ubuntu. Cependant, j'ai réussi à faire fonctionner ce petit échantillon de code.

// Create a window for full-screen mode; add a button to leave full-screen mode
GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment().
                    getDefaultScreenDevice(); 
                    //or initialize this for a specific display
Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);
Canvas c = new Canvas();
c.setBackground(Color.RED);
win.add(c);
win.show();  //or setVisible(true);

// Enter full-screen mode
gs.setFullScreenWindow(win);
win.validate();

l'astuce qui a fonctionné est de rendre la fenêtre d'abord visible, puis de la placer en mode plein écran. Paramétrer le mode plein écran avant qu'il ne soit affiché a donné lieu à la barre de tâches au-dessus de la fenêtre.

1
répondu ricosrealm 2017-07-19 22:36:18