2017-09-30 5 views
0

Je rencontre un problème pour savoir quelle est la meilleure façon d'ajouter un élément String aléatoire de mon tableau dans JTextArea . Mon problème est que je ne peux pas avoir les deux mêmes chaînes de ma sortie de tableau en succession les uns des autres. (ne peut pas être le même que le dernier présenté). J'ai essayé de vraies boucles, pour des boucles. Je ne suis pas sûr de savoir comment écrire cette contrainte. Tout pointeur dans la bonne direction serait apprécié. Été à ce problème pendant un moment et j'ai ramassé stackoverlow de haut en bas. Mon code fonctionne bien maintenant, mais le problème que j'ai rencontré est dans la méthode createBottomPanel() dans le btnSubmit actionlistener. MerciChaîne aléatoire de tableau, ne peut pas avoir deux mêmes chaînes choisies les unes après les autres Java

package Tell; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.util.Random; 

public class FortuneTellerFrame extends JFrame { 

JPanel pnlTop, pnlMiddle, pnlBottom; 
JButton btnSubmit, btnQuit; 
JLabel lblFortuneTeller, lblPassword; 
JTextArea txaResults; 
JScrollPane jsp; 
String[] fortunes = {"A loved one will die","You will recieve a gift", 
    "A mysterious person will come into your life","You will encounter misfortune soon", 
    "Life will become easier for you","Sadness will overcome you", 
    "Good tidings are in your future","Some sum of money will find its way to you", 
    "Good news is around the corner","Persevere and you shall be rewarded", 
    "You will run out of time at a bad moment","You will fall and break a leg"}; 

public FortuneTellerFrame() { 
    add(this.createTopPanel(), BorderLayout.NORTH); 
    add(this.createMiddlePanel(), BorderLayout.CENTER); 
    add(this.createBottomPanel(), BorderLayout.SOUTH); 

    // Always set the size of data and the default close operation. 
    // Visibility needs to be set to true to be seen as well 
    this.setSize(400, 300); 
    this.setVisible(true); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    } 
    private JPanel createTopPanel() 
    { 
     pnlTop = new JPanel(); 
     pnlTop.setLayout(new GridLayout(2,2)); 
     ImageIcon icon = new ImageIcon("ball.jpg"); 
     Image image1 = icon.getImage(); // transform it 
     Image newimg = image1.getScaledInstance(75, 75, java.awt.Image.SCALE_SMOOTH); 
     icon = new ImageIcon(newimg); // transform back 
     JLabel label = new JLabel("Fortune Teller",icon,JLabel.CENTER); 
     label.setForeground(Color.red); 
     label.setFont(new Font ("Lucida Sans Unicode", Font.BOLD, 20)); 
     label.setHorizontalTextPosition(JLabel.CENTER); 
     label.setVerticalTextPosition(JLabel.BOTTOM); 

     pnlTop.add(label); 

     return pnlTop; 
    } 

    private JPanel createMiddlePanel() 
    { 
     pnlMiddle = new JPanel(); 
     txaResults = new JTextArea(10, 30); 
     txaResults.setFont(new Font ("Serif", Font.ITALIC, 10)); 
     jsp = new JScrollPane(txaResults,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
       JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     pnlMiddle.add(jsp); 

     return pnlMiddle; 
    } 
    private JPanel createBottomPanel() 
    { 

     pnlBottom = new JPanel(); 
     btnSubmit = new JButton("Read My Fortune!"); 
     btnQuit = new JButton("Quit"); 
     btnSubmit.setFont(new Font ("Arial", Font.BOLD, 9)); 
     btnQuit.setFont(new Font ("Arial", Font.BOLD, 9));  

     btnQuit.addActionListener(e ->{ 
      System.exit(0); 
     }); 

     btnSubmit.addActionListener(e ->{ 
      //String username = this.txtFortuneTeller.getText(); 

      Random rand = new Random(); 
      String x = fortunes[rand.nextInt(fortunes.length)]; 

      this.txaResults.append(x + "\n"); 
     }); 

     pnlBottom.add(btnSubmit); 
     pnlBottom.add(btnQuit); 

     return pnlBottom; 
    } 

}

+2

Pourquoi ne pas randomize fortune (une fois) un Et puis l'itérer? –

+0

'Collections.shuffle (Arrays.toList (fortunes))' le ferait. –

+0

@AndyTurner J'ai suivi votre code et je continue d'obtenir une erreur de symbole introuvable pour la méthode toList. J'ai importé les bibliothèques de liste et de tableau, mais pour une raison quelconque, je reçois toujours une erreur. Pourrait-il avoir quelque chose à voir avec le type? Mes éléments de tableau sont des chaînes –

Répondre

0

Si je comprends correct et chaque réponse peut se produire plusieurs fois, mais pas dans la succession directe, l'approche la plus simple serait de se rappeler la dernière chance et sauter si elle se produit deux fois:

class FortuneAppenderAction implements ActionListener { 

    private String lastFortune = null; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Random rand = new Random(); 
     String x; 
     do { 
      x = fortunes[rand.nextInt(fortunes.length)]; 
     } 
     while (x.equals(lastFortune)); 
     lastFortune = x; 
     txaResults.append(x + "\n"); 
    } 
} 

Et createBottomPanel():

btnSubmit.addActionListener(new FortuneAppenderAction());