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");
}
}
}
Il y a un certain nombre de concepts importants qui semblent vous manquer.
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#sleep
par 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 Thread
pour "attendre" en arrière-plan et retourner les cartes ou vous pouvez utiliser a SwingWorker
ou 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 Thread
autre 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é.
SwingWorker
et javax.swing.Timer
ont des fonctionnalités qui rendent cela beaucoup plus facile.
Les threads et SwingWorker
sont 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.Timer
conviendrait 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.
laisse moi dire quelques mots