Question

bonne journée! Je voulais utiliser une minuterie standard standard avec un mode exclusif plein écran. À cet effet, j'ai appliqué un swingworker pour contrôler l'événement lorsque le mode graphique doit être défini. Toutes les étapes suivantes sont exécutées dans la méthode d'exécution. Run () est appelé de la principale. 1) Tout d'abord, je crée mon objet SwingWorker et remplace deux méthodes (DoIndbackground et effectué). Init est une méthode importante car il doit définir tout le réglage graphique nécessaire à l'objet JFRAME actuel et lier mon fichier d'écouteur clé (appelé screen_list) avec celui-ci:

...
worker = new SwingWorker<Window, Void>() 
    {
            public Window doInBackground() 
            {
                init();
                return gdev.getFullScreenWindow();
            }

            public void done() 
            {
                try {
                    disp = get();
                } 
                catch (InterruptedException ignore) {}
                catch (java.util.concurrent.ExecutionException e) {
                    String why = null;
                    Throwable cause = e.getCause();
                    if (cause != null) {
                        why = cause.getMessage();
                    } else {
                        why = e.getMessage();
                    }
                    System.err.println("Error retrieving file: " + why);
                }
            }
    };

...

2) Puis je crée mon scénarioListener qui implémente un actelistener et un auditeur de clé, il est lié avec SUN TIYLISTENER à INIT () Méthode:

private void init()
    {

        ...
    try 
            {
                disp = gdev.getFullScreenWindow();
                if(disp != null)
                {
                    gdev.setDisplayMode(use_dm);
                    disp.createBufferStrategy(2);
                    disp.setFocusTraversalKeysEnabled(false);
                    disp.addKeyListener((KeyListener)screen_list);
                }   
            }
            catch(IllegalArgumentException ex) 
            { 
            }   
        ...
       }

3) Je crée et initialise mon minuteur battant et commencez-le; 4) Et enfin, j'appelle la méthode d'exécution:

public void run(int pause, int delay)
{
...
try
    {   
        screen_list = new ScreenListener();
        tm = new Timer(delay, screen_list);
        tm.setInitialDelay(pause);
        tm.setRepeats(true);
        tm.start();
        worker.execute();
    }
    catch(Exception e)
    {}
    ...
}

Screenlistener de classe comme je l'ai écrit implémente un Keylistener et un actelistener. Dans la méthode ActionperFomed, je découvre que le travailleur a fait son travail (méthode init), si oui, je reçois une référence en mode d'affichage actuel et dessiner quelque chose:

    class ScreenListener implements ActionListener, KeyListener 
    {

        public void actionPerformed(ActionEvent e)
        {

        if(!worker.isDone())
                    {
                        return;
                    }
                    else
                    {
                        //gdev - GraphicsDevice type
                        disp = gdev.getFullScreenWindow();
                        if (disp != null) 
                        {
                            ...         
                            draw(gr);
                            ...
                        }
                    }
          }
    ...
    }

Pourquoi ne sont-ils pas des événements du clavier traité?

Était-ce utile?

La solution 2

J'ai utilisé des capacités SwingWorker car le mode plein écran n'a pas encore été défini par la minuterie temporelle déjà démarrée. Ок.Je suis passé à l'aide d'un swingworker.Au lieu de cela, j'ai ajouté une condition simple:

class ScreenListener implements ActionListener, KeyListener 
{
    public void actionPerformed(ActionEvent e)
            {
                System.out.println("ScreenListener: actionPerformed");
                disp = gdev.getFullScreenWindow();
                if(disp == null)
                {
                    return;
                }
                else
                {
                 //draw something
                 ...
                }
            }

}

Alors maintenant, ma méthode de course ressemble à ceci

   public void run(int pause, int delay)
    {
        screen_list = new ScreenListener();
        init();
        try
        {   
            tm = new Timer(delay, (ActionListener)screen_list);
            tm.setInitialDelay(pause);
            tm.setRepeats(true);
            tm.start();
        }
        catch(Exception ex)
        {
             ex.printStackTrace();
        }
        finally
        {
            if(!tm.isRunning())
            {
             ...
            }
        }
     }

Et je me concentre concentrez-vous?

private void init()
{
    JFrame frame = new JFrame();
    ...
    disp = new Window(frame);

    DisplayMode[] dms = gdev.getDisplayModes();

    DisplayMode use_dm = null;

    if(gdev.isFullScreenSupported())
    {
        disp.setBackground(Color.CYAN);
        disp.setForeground(Color.WHITE);
        gdev.setFullScreenWindow(disp);
    }

    use_dm = getMatchMode(dms, def_dm);

    try 
    {
        disp = gdev.getFullScreenWindow();
        if(disp != null)
        {
            ...
            disp.setFocusable(true);
            disp.addKeyListener((KeyListener)screen_list);
            ...
        }   
    }
    catch(IllegalArgumentException ex) 
    { 
         ex.printStackTrace();
    }   
}

Mais je ne peux pas toujours attraper mes événements de clavier.KeyTyped, KeyRimprimé, KeyReleased ne s'appelle toujours pas, donc c'est mon problème dans ce programme.

Mon premier objectif était de faire une animation simple avec le mode plein écran.Au début, j'ai utilisé une simple méthode de fil - Dormir - comme pour le fil principal.Ensuite, j'ai ajouté une minuterie pivotante dans le même but que vous avez l'air que vous avez un problème: je ne peux pas faire pour travailler mon Keylistener.

Autres conseils

Je ne fais pas tous ces appels de swing d'init. Init doit définir tout le réglage graphique nécessaire à l'objet JFRAME actuel et lier à l'auditeur de clé de liaison avec celui-ci.

OK, je vois que vous avez changé votre code certains:

private void init()
{

    ...
try 
        {
            disp = gdev.getFullScreenWindow();
            if(disp != null)
            {
                gdev.setDisplayMode(use_dm);
                disp.createBufferStrategy(2);
                disp.setFocusTraversalKeysEnabled(false);
                disp.addKeyListener((KeyListener)screen_list);
            }   
        }
        catch(IllegalArgumentException ex) 
        { 
        }   
    ...
   }

Mais vous faites toujours des appels de swing in init lorsque vous obtenez le jframe, définissez sa stratégie d'affichage et sa stratégie de mémoire tampon, c'est une entreprise de mise au point sur la mise au point et ajoutez un auditeur clé. Pourquoi ces appels sont-ils fabriqués dans un fil d'arrière-plan car ils ne seraient pas censés interférer avec le traitement de la balançoire (il n'est donc pas nécessaire d'être fait en arrière-plan) et sont donc "appels de swing" car vous modifiez l'état de swing objets avec eux. DoIndbackground est destiné à exécuter des processus à long terme ou à forte intensité de la CPU que, si elle est exécutée sur l'EDT gelerait l'interface graphique et la rendre insensible. Le code que vous avez montré ne fait pas cela. Le danger de faire des appels de balançoire dans un fil d'antécédents est que, alors qu'il fonctionnera 95% du temps, il échouera à des moments inattendus, ce qui entraînera une collision et une brûlure de votre application, généralement à l'heure la plus inopportune.

Aussi, pourquoi le bloc de capture vide? J'avais au moins mettre dans une ex.printStackTrace () de manière à ne pas voler aveugle.

2) Puis je crée mon scénarioListener qui implémente un actelistener et un auditeur de clé, il est lié avec SUN TIYLISTENER à INIT () Méthode:

Ainsi, j'ai raison de dire que vous ajoutez un Keylistener à un jframe? Je doute que cela fonctionnera depuis que les Keylisteners ne répondent que si le composant lié a la focalisation, quelque chose qu'un jframe ferait rarement ou que je voudrais faire. Vous souhaitez peut-être utiliser les liaisons de clés plus polyvalentes, car cela permettra une plus grande flexibilité en ce qui concerne la concentration et la réactivité.

3) Puis je crée et initialise mon minuteur battant et commencez-le;

OK

4) Et enfin, je appelle la méthode exécute. -

public void run(int pause, int delay)
{
...
try
    {   
        screen_list = new ScreenListener();
        tm = new Timer(delay, screen_list);
        tm.setInitialDelay(pause);
        tm.setRepeats(true);
        tm.start();
        worker.execute();
    }
    catch(Exception e)
    {}
    ...
}

Encore une fois, vous avez un bloc de capture vide.

Et pouvez-vous nous en dire plus sur vos problèmes spécifiques? Nous voyons des morceaux de code sans rapport avec une description vague de quelque sorte de ce qu'elle fait, mais n'a pas vraiment d'idée de rien encore. Pouvez-vous nous donner une description plus détaillée de votre programme et de ses problèmes? Essayez-vous de créer le SSCCE comme recommandé par Andrew? Si vous pouviez créer et poster cela, nous serions beaucoup mieux en mesure de tester et de modifier votre programme et de vous aider à trouver une solution. Bonne chance

J'ai décidé mon problème:

1) Maintenant, la classe FullScreen s'étend de JFRAMAME:

public class SimpleFullScreen extends JFrame 
{
...
    private synchronized void init()
    {
        Window disp = null;
        //customize my display
        setFocusable(true);
        setResizable(false);
        setIgnoreRepaint(true);
        setUndecorated(true);
        setBackground(Color.CYAN);
        setForeground(Color.WHITE);     
        addKeyListener((KeyListener)screen_list);

        DisplayMode[] dms = gdev.getDisplayModes();

        DisplayMode use_dm = null;

        if(gdev.isFullScreenSupported())
            gdev.setFullScreenWindow(this);

        use_dm = getMatchMode(dms, def_dm);

        try 
        {
            disp = gdev.getFullScreenWindow();
            if(disp != null)
            {
                gdev.setDisplayMode(use_dm);
                createBufferStrategy(2);
            }   
        }
        catch(IllegalArgumentException ex) 
        { 
             ex.printStackTrace();
        }   
    }
...
}

2) Ajouter une boucle dans la méthode d'exécution, il vérifie la minuterie en cours d'exécution:

public void run(int pause, int delay)
{
    Window disp = null;
    screen_list = new ScreenListener();
    init();
    try
    {   
        //Initialize and start timer 
                    ...
        while(tm.isRunning())
        {
            System.out.println("Run: timer running");
        }
    }
    catch(Exception ex)
    {
         ex.printStackTrace();
    }
    finally
    {
        try
        {
            if(!tm.isRunning())
            {
                disp = gdev.getFullScreenWindow();
                disp.setVisible(false);
                disp.dispose();
                gdev.setFullScreenWindow(null);
                System.exit(0);
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

3) Init, ActionperFomed et Keauprimé est devenu les méthodes synchronisées.

SO ACTIONLISTENER ET KEYLISTENER fonctionne bien.

Merci pour des réponses!

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