SwingWorker, Thread.sleep () o javax.swing.timer? Ho bisogno di “inserire una pausa”

Sto lavorando a un gioco di memoria e voglio configurarlo, quindi faccio clic sulla prima "card" , poi sulla seconda e se non sono la stessa seconda scheda mostra per alcuni secondi, quindi tornano alla "non-flipped" posizione.

Ho provato a utilizzare SwingWorker , Thread.sleep e SwingTimer ma non riesco a farlo funzionare. Con Thread.sleep la seconda scheda non si "flip" se si tratta di un duplicato, attende la quantità di tempo di sonno e scompare. Se non corrisponde, attende “a faccia in giù” e dopo il timer di spegnimento la prima carta si ribalta. Ciò accade indipendentemente da dove metto il Thread.sleep.

Con Swing Timer sembra solo “cambiare il timer” mentre sto interagendo con le carte, così finisco per lanciare 8 carte prima che si attivino.

Non ho avuto fortuna con SwingWorker e non sono nemmeno sicuro che funzionerà per quello che sto cercando.

Questo è il codice che ho:

  class ButtonListener implements ActionListener { public void actionPerformsd(ActionEvent e) { for(int index = 0; index < arraySize; index++) { if(button[index] == e.getSource()) { button[index].setText(String.valueOf(cards.get(index))); button[index].setEnabled(false); number[counter]=cards.get(index); if (counter == 0) { counter++; } else if (counter == 1) { if (number[0] == number[1]) { for(int i = 0; i < arraySize; i++) { if(!button[i].isEnabled()) { button[i].setVisible(false); } } } else { for(int i = 0; i < arraySize; i++) { if(!button[i].isEnabled()) { button[i].setEnabled(true); button[i].setText("Card"); } } } counter = 0; } } } } } 

Fondamentalmente ciò di cui ho bisogno è che questo codice venga eseguito quando il contatore == 1, e la carta non è una corrispondenza:

  button[index].setText(String.valueOf(cards.get(index))); button[index].setEnabled(false); 

Quindi una pausa così la card is revealed per quel tempo, e infine riprende a riportare la carta in posizione coperta.

Questo è quello che ho provato con Thread.sleep() :

 class ButtonListener implements ActionListener { public void actionPerformsd(ActionEvent e) { for(int index = 0; index < arraySize; index++) { if(button[index] == e.getSource()) { button[index].setText(String.valueOf(cards.get(index))); button[index].setEnabled(false); number[counter]=cards.get(index); if (counter == 0) { counter++; } else if (counter == 1) { if (number[0] == number[1]) { for(int i = 0; i < arraySize; i++) { if(!button[i].isEnabled()) { button[i].setVisible(false); } } } else { try { Thread.sleep(800); } catch (InterruptedException e1) { e1.printStackTrace(); } for(int i = 0; i < arraySize; i++) { if(!button[i].isEnabled()) { button[i].setEnabled(true); button[i].setText("Card"); } } } counter = 0; } } } } } 

Grazie in anticipo per qualsiasi consiglio

Utilizza javax.swing.Timer per programmare un evento futuro da triggersre. Ciò ti consentirà di apportare modifiche all’interfaccia utente in modo sicuro, poiché il timer viene triggersto nel contesto del thread Dispatching eventi.

Il problema di poter capovolgere più carte contemporaneamente ha più a che fare con te non impostando uno stato che impedisce all’utente di lanciare le carte e quindi l’uso dei timer.

L’esempio seguente in pratica consente solo di capovolgere una carta per gruppo alla volta.

Una volta che una carta è stata girata in entrambi i gruppi, il timer viene avviato. Quando viene triggersto, le carte vengono ripristinate.

inserisci la descrizione dell'immagine qui

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.LinearGradientPaint; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.LineBorder; public class FlipCards { public static void main(String[] args) { new FlipCards(); } public FlipCards() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class Card extends JPanel { private BufferedImage image; private boolean flipped = false; private Dimension prefSize; public Card(BufferedImage image, Dimension prefSize) { setBorder(new LineBorder(Color.DARK_GRAY)); this.image = image; this.prefSize = prefSize; } @Override public Dimension getPreferredSize() { return prefSize; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); LinearGradientPaint lgp = new LinearGradientPaint( new Point(0, 0), new Point(0, getHeight()), new float[]{0f, 1f}, new Color[]{Color.WHITE, Color.GRAY}); g2d.setPaint(lgp); g2d.fill(new Rectangle(0, 0, getWidth(), getHeight())); if (flipped && image != null) { int x = (getWidth() - image.getWidth()) / 2; int y = (getHeight() - image.getHeight()) / 2; g2d.drawImage(image, x, y, this); } g2d.dispose(); } public void setFlipped(boolean flipped) { this.flipped = flipped; repaint(); } } public class CardsPane extends JPanel { private Card flippedCard = null; public CardsPane(List images, Dimension prefSize) { setLayout(new GridBagLayout()); MouseAdapter mouseHandler = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (flippedCard == null) { Card card = (Card) e.getComponent(); card.setFlipped(true); flippedCard = card; firePropertyChange("flippedCard", null, card); } } }; GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(4, 4, 4, 4); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 0.25f; for (BufferedImage img : images) { Card card = new Card(img, prefSize); card.addMouseListener(mouseHandler); add(card, gbc); } } public Card getFlippedCard() { return flippedCard; } public void reset() { if (flippedCard != null) { flippedCard.setFlipped(false); flippedCard = null; } } } public class TestPane extends JPanel { private CardsPane topCards; private CardsPane bottomCards; private Timer resetTimer; public TestPane() { resetTimer = new Timer(1000, new ActionListener() { @Override public void actionPerformsd(ActionEvent e) { topCards.reset(); bottomCards.reset(); } }); resetTimer.setRepeats(false); resetTimer.setCoalesce(true); PropertyChangeListener propertyChangeHandler = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Card top = topCards.getFlippedCard(); Card bottom = bottomCards.getFlippedCard(); if (top != null && bottom != null) { resetTimer.start(); } } }; BufferedImage[] images = new BufferedImage[4]; try { images[0] = ImageIO.read(new File("./Card01.png")); images[1] = ImageIO.read(new File("./Card02.jpg")); images[2] = ImageIO.read(new File("./Card03.jpg")); images[3] = ImageIO.read(new File("./Card04.png")); Dimension prefSize = getMaxBounds(images); List topImages = new ArrayList<>(Arrays.asList(images)); Random rnd = new Random(System.currentTimeMillis()); int rotate = (int) Math.round((rnd.nextFloat() * 200) - 50); Collections.rotate(topImages, rotate); topCards = new CardsPane(topImages, prefSize); topCards.addPropertyChangeListener("flippedCard", propertyChangeHandler); List botImages = new ArrayList<>(Arrays.asList(images)); int botRotate = (int) Math.round((rnd.nextFloat() * 200) - 50); Collections.rotate(botImages, botRotate); bottomCards = new CardsPane(botImages, prefSize); bottomCards.addPropertyChangeListener("flippedCard", propertyChangeHandler); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(4, 4, 4, 4); gbc.gridwidth = GridBagConstraints.REMAINDER; add(topCards, gbc); add(bottomCards, gbc); } catch (Exception e) { e.printStackTrace(); } } protected Dimension getMaxBounds(BufferedImage[] images) { int width = 0; int height = 0; for (BufferedImage img : images) { width = Math.max(width, img.getWidth()); height = Math.max(height, img.getHeight()); } return new Dimension(width, height); } } }