Mettre à jour correctement les composants de la balançoire?

Ron:

Je suis nouveau dans le swing, toute aide appréciée.

Dans ce morceau de code, je retourne une carte face vers le haut, s'il s'avère qu'elles ne correspondent pas, je veux qu'elles se retournent à nouveau face cachée.

En ce moment, ce qui se passe: 1. quand on clique sur la première carte se retourne 2. quand on clique sur une deuxième carte, l'une ou l'autre des deux choses se produit (a) si elles sont identiques, elles restent toutes les deux en place, ce que je veux (b) si ils ne sont pas les mêmes Je ne vois jamais du tout la 2ème carte car elle réaffiche immédiatement le dos de la carte (et le dos de la carte précédente également comme défini dans ma méthode).

Je pensais que la mise en veille pourrait garder la deuxième carte affichée pendant un certain temps avant de se retourner, mais ce n'est pas le cas.

J'ai essayé d'utiliser contentPane.revalidate (); & contentPane.repaint (); mais cela ne change rien.

J'ai mis quelques sorties console:

Console output:
Card: 0 set
Card: 6 set
Sleeping now
Card: 6 unset
Card: 0 unset

Ci-dessus se trouve la sortie de la console résultante en cliquant sur deux cartes qui ne correspondent pas

@Override
public void actionPerformed(ActionEvent e) 
{
    String buttonPressed = e.getActionCommand();
    int pos = Integer.valueOf(buttonPressed);
    action = Control.model.ReceiveCardsTurned(pos);

    keypadArray[pos].setIcon(myIcons[pos]);     
    System.out.println("Card: "+pos+" set");
    currentTime.setText("" + Control.model.time);
    currentScore.setText("" + Control.model.score);

    //contentPane.revalidate();
    //contentPane.repaint();        

    if(Control.model.twoCardsTurned == false)
    {
        if (action == "unturn") 
        {
            System.out.println("Sleeping now");

            try 
            {
                Thread.sleep(1000);
            }

            catch (InterruptedException e1) 
            {
                e1.printStackTrace();
            }

            keypadArray[pos].setIcon(back);
            keypadArray[Control.model.lastCard].setIcon(back);
            System.out.println("Card: "+pos+" unset");
            System.out.println("Card: "+Control.model.lastCard+" unset");
        }
    }
}
Programmes alimentaires:

Il y a un certain nombre de concepts importants qui semblent vous manquer.

  1. Swing est un environnement événementiel. Cela signifie qu'il n'y a aucun moyen (ou du moins très peu) que vous puissiez "attendre" l'entrée de l'utilisateur, généralement, il vous suffit de réagir à leur interaction.
  2. Swing est piloté par un seul thread, connu sous le nom de fil de distribution d'événements (AKA EDT). Il est de la responsabilité de ce thread d'envoyer / traiter les événements entrant dans l'application aux parties appropriées de l'application afin qu'elles puissent prendre des mesures.
  3. Le responsable de la peinture publie ses demandes de mise à jour sur l'EDT.

TOUTE action que vous entreprenez qui empêche l'EDT d'effectuer ce travail donnera l'impression que votre application est bloquée.

Vous ne devez JAMAIS effectuer d'opérations chronophages (comme des E / S, des boucles ou Thread#sleeppar exemple) sur l'EDT, cela mettra votre application en "pause", ce qui n'est jamais joli.

Jetez un œil à la concurrence dans Swing pour plus d'informations.

Maintenant, vous avez un certain nombre de choix. Vous pouvez utiliser a Threadpour "attendre" en arrière-plan et retourner les cartes ou vous pouvez utiliser a SwingWorkerou a javax.swing.Timer.

L'autre problème que vous rencontrez est que vous ne devez JAMAIS mettre à jour des composants d'interface utilisateur à partir de tout Threadautre que l'EDT. Cela signifie que si vous utilisiez a Thread, vous deviendriez responsable de la resynchronisation de ce thread avec l'EDT. Bien que ce ne soit pas difficile, cela devient tout simplement désordonné.

SwingWorkeret javax.swing.Timeront des fonctionnalités qui rendent cela beaucoup plus facile.

Les threads et SwingWorkersont parfaits pour effectuer un traitement en arrière-plan et seraient simplement exagérés pour ce problème. Au lieu de cela, un javax.swing.Timerconviendrait parfaitement ici.

if (!Control.model.twoCardsTurned)
    {
        if ("unturn".equals(action)) 
        {
            new Timer(1000, new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    keypadArray[pos].setIcon(back);
                    keypadArray[Control.model.lastCard].setIcon(back);
                    System.out.println("Card: "+pos+" unset");
                    System.out.println("Card: "+Control.model.lastCard+" unset");
                }
            }).start();
        }
    }

Ceci est un exemple vraiment simple. Vous voudrez peut-être mettre en place des contrôles qui empêcheront l'utilisateur de cliquer sur quoi que ce soit jusqu'à ce que le minuteur se déclenche, par exemple;)

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comment mettre à jour correctement les composants de la bibliothèque

Les composants de balançoire sont légers?

composants de remplacement de balançoire sur GridBagLayout

Comment mettre à jour conditionnellement les composants de la liste de réactions

Mettre à jour et accéder à la variable de message d'alerte entre les composants Vue

Les composants Vue cessent de se mettre à jour lorsque la page est traduite par Google Translate

Comment mettre à jour les composants enfants dans la table à l'aide de livewire?

Comment utiliser les curseurs dans la balançoire clojure

Ensemble de balançoire

Comment mettre à jour dynamiquement les styles de composants angulaires

Comment mettre à jour correctement les données JTable avec la base de données MySQL?

Impossible de mettre à jour la valeur des composants Apexcharts

Mettre à jour les composants créés dynamiques

Mettre à jour tous les composants React children

Mettre à jour les composants créés dynamiques

Comment retarder mon application et mettre à jour les composants de la mise en page à chaque itération d'une boucle

pyqt: mettre à jour correctement QGridLayout lors de la suppression de tous les éléments et de l'ajout de nouveaux

La commande SQL ne s'est pas terminée correctement erreur ; essayer de mettre à jour les informations avec une jointure

utilisation de l'écouteur de changement de propriété pour mettre à jour les composants swing

Aligner les éléments d'un panneau sur la balançoire supérieure

Comment mettre à jour les données des composants après avoir appelé la fonction montée?

Inno Setup: mettre à jour la taille requise après avoir décoché les composants par programme

Mettre à jour les styles de composants dynamiquement à partir de l'état lors du chargement initial?

Mettre à jour les données de service à partir de plusieurs composants - Abonnement observable

comment mettre à jour les composants de l'interface utilisateur de kendo pour utiliser MultiColumnComboBox

Changer et mettre à jour les composants JPanel en externe, à partir de JFrame ne fonctionne pas, Swing

Apache Wicket - Le meilleur moyen de mettre à jour tous les composants partageant un certain modèle

Angular 4 - Mettre à jour le contenu de manière dynamique entre les composants

Livewire: impossible de mettre à jour les composants enfants après l'ajout d'un nouvel enregistrement

TOP liste

  1. 1

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  2. 2

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  3. 3

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  4. 4

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  5. 5

    Trouver l'intersection et l'union de deux rectangles

  6. 6

    Comment changer la couleur de la police dans R?

  7. 7

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  8. 8

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  9. 9

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  10. 10

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  11. 11

    Comment convertir une chaîne en tuple en utilisant `reads`?

  12. 12

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  13. 13

    comment afficher un bouton au-dessus d'un autre élément ?

  14. 14

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  15. 15

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  16. 16

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  19. 19

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  20. 20

    comment le contrôle de tableau javascript devrait-il être

  21. 21

    impossible d'ouvrir un nouvel onglet dans react, ajoute localhost: 3000 sur le lien?

chaudétiquette

Archive