Salut,
Bon, je ne peux pas exécuter ton code en pas à pas tel quel.
J'ai supprimé les références à la "console" et ajouté une méthode main pour arriver à mes fins.
Problèmes techniques : tes threads sont instanciés avec des paramètres nuls (nb de séries, nb de tirages par série) -> il faut les instancier seulement au début de l'action ou alors ajuster ces paramètres à ce moment. De plus les paramètres ne sont pas dans le bon ordre pour le premier thread (regarde ton appel). La matrice est instanciée en dehors du constructeur dans ta classe de génération de la matrice aléatoire, ce qui fait qu'elle est toujours de dimension 0x0.
Défauts importants : l'écriture dans le fichier est très lente puisque tu ouvres le fichier en écriture à chaque donnée, il vaut mieux ouvrir un flux d'écriture sur le fichier, y mettre toutes les données puis le fermer. Chez moi j'ai environ 500 octets par seconde, mon disque dur peut aller 100'000 fois plus vite en faisant ça bien.
Conception : si tu es dans une filière de génie logiciel, un petit design pattern producteur / consommateur aurait été judicieux.
Voilà le code corrigé qui fonctionne chez moi (mais sans la console du coup) :
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
//Création de la fenêtre
class tirageAleaRandom extends JFrame {
private static final long serialVersionUID = 1L;
public tirageAleaRandom(String nom, int positionX, int positionY,
int largeur, int hauteur) {
super(nom);
setBounds(positionX, positionY, largeur, hauteur);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(new panneauAlea());
setResizable(false);
setVisible(true);
}
/**
*
* @param args
*/
public static void main(String[] args) {
new tirageAleaRandom("test", 0, 0, 1024, 600);
}
}
// Création du panneau de la fenêtre
class panneauAlea extends JPanel {
// Déclaration des objets de la fenêtre
private static final long serialVersionUID = 1L;
// Création des polices de la fenêtre
private Font f1 = new Font("Matura MT Script Capitals", Font.BOLD, 30);
private Font f2 = new Font("Comic sans MS", Font.BOLD, 18);
private Font f3 = new Font("Book antica", 1, 14);
private Font f3bis = new Font("Book antica", 0, 40);
private Font f4 = new Font("Calibri", 12, 18);
private Font f4bis = new Font("Calibri", Font.BOLD, 30);
// Création des libellés
private JLabel intit = new JLabel(
"Générateur de données aléatoires entières");
private JLabel en = new JLabel("Chemin où enregistrer le fichier :");
private JLabel Inter = new JLabel("Intervalle de tirage :");
private JLabel bI = new JLabel("[");
private JLabel mil = new JLabel(";");
private JLabel bS = new JLabel("]");
private JLabel tirages = new JLabel("Nombre de tirages/série :");
private JLabel serie = new JLabel("Nombre de séries :");
// Création des zones de texte
private JTextField enT = new JTextField("", 100);
private JTextField Bi = new JTextField("", 10);
private JTextField Bs = new JTextField("", 10);
private JTextField ser = new JTextField("", 10);
private JTextField tir = new JTextField("", 10);
// Déclaration des boutons de la fenêtre
private JButton GO = new JButton("Créer le fichier");
private JButton chemI = new JButton("Parcourir...");
// Déclaration des variables de tirage. RAZ = Remise A Zero de la console
private int borneSup, borneInf, nbSerie, nbTirage, i, j, k, l, RAZ;
// Constructeur du panneau de la fenêtre
@SuppressWarnings("static-access")
public panneauAlea() {
setBackground(Color.black);
intit.setForeground(new Color(128, 0, 128));
en.setForeground(Color.white);
enT.setBackground(Color.white);
enT.setForeground(Color.BLACK);
Inter.setForeground(Color.white);
serie.setForeground(Color.white);
tirages.setForeground(Color.white);
bI.setForeground(Color.white);
mil.setForeground(Color.white);
bS.setForeground(Color.white);
Bi.setBackground(Color.BLACK);
Bi.setForeground(Color.white);
Bs.setBackground(Color.BLACK);
Bs.setForeground(Color.white);
ser.setBackground(Color.BLACK);
ser.setForeground(Color.white);
tir.setBackground(Color.BLACK);
tir.setForeground(Color.white);
GO.setForeground(Color.yellow);
GO.setBackground(new Color(0, 0, 160));
intit.setFont(f1);
en.setFont(f3);
Inter.setFont(f3);
serie.setFont(f3);
tirages.setFont(f3);
bI.setFont(f3bis);
bS.setFont(f3bis);
mil.setFont(f3bis);
enT.setFont(f4);
GO.setFont(f2);
Bi.setFont(f4bis);
Bs.setFont(f4bis);
ser.setFont(f4bis);
tir.setFont(f4bis);
GO.addMouseListener(new Click());
GO.addActionListener(new cestParti());
chemI.addActionListener(new cheminIN());
setLayout(null);
intit.setBounds(180, 30, 800, 50);
en.setBounds(10, 115, 250, 60);
enT.setBounds(255, 130, 630, 30);
Inter.setBounds(230, 220, 250, 60);
bI.setBounds(387, 215, 20, 60);
Bi.setBounds(410, 227, 150, 43);
mil.setBounds(572, 215, 20, 60);
Bs.setBounds(595, 227, 150, 43);
bS.setBounds(755, 215, 20, 60);
serie.setBounds(230, 305, 250, 60);
ser.setBounds(450, 315, 100, 43);
tirages.setBounds(230, 395, 250, 60);
tir.setBounds(450, 405, 100, 43);
chemI.setBounds(885, 130, 100, 30);
GO.setBounds(400, 515, 200, 60);
add(intit);
add(en);
add(enT);
add(chemI);
add(Inter);
add(bI);
add(Bi);
add(mil);
add(Bs);
add(bS);
add(serie);
add(ser);
add(tirages);
add(tir);
add(GO);
Bi.setHorizontalAlignment(Bi.CENTER);
Bs.setHorizontalAlignment(Bs.CENTER);
ser.setHorizontalAlignment(ser.CENTER);
tir.setHorizontalAlignment(ser.CENTER);
ser.setCaretColor(Color.white);
Bs.setCaretColor(Color.white);
Bi.setCaretColor(Color.white);
tir.setCaretColor(Color.white);
chemI.setFocusable(false);
GO.setFocusable(false);
RAZ = 1;
}
// Ecouteur du bouton pour trouver le chemin d'accès au fichier à Créer
class cheminIN implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
if (chemI.isEnabled() == true) {
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showDialog(getParent(),
"Enregistrer ici");
if (returnVal == JFileChooser.APPROVE_OPTION) {
enT.setText(chooser.getSelectedFile().getAbsolutePath()
+ ".txt");
}
}
}
}
// Ecouteur du bouton de démarrage du programme
class cestParti implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (GO.isEnabled() == true) {
GO.setEnabled(false);
Bi.setEnabled(false);
Bs.setEnabled(false);
ser.setEnabled(false);
chemI.setEnabled(false);
GO.repaint();
enT.setEditable(false);
Bi.setEditable(false);
Bs.setEditable(false);
ser.setEditable(false);
if (RAZ == 1) {
RAZ--;
}
if (verificationDesEntrées() == true) {
// Placement du remplissage de la matrice et du remplissage
// de fichier dans
// des threads séparés
MatriceAléa données = new MatriceAléa(nbTirage, nbSerie,
borneSup, borneInf);
remplissageFichier fichierDeDonnées = new remplissageFichier(
nbTirage, nbSerie);
données.setRemplissageFichier(fichierDeDonnées);
fichierDeDonnées.setDonnees(données);
Thread threadMA = new Thread(données);
threadMA.start();
} else {
GO.setEnabled(true);
Bi.setEnabled(true);
Bs.setEnabled(true);
ser.setEnabled(true);
chemI.setEnabled(true);
enT.setEditable(true);
Bi.setEditable(true);
Bs.setEditable(true);
ser.setEditable(true);
}
}
}
}
// Action du clique de la souris sur le Bouton de tirage (pour la forme
// uniquement)
class Click implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
if (GO.isEnabled() == true) {
GO.setBackground(Color.white);
GO.setForeground(Color.BLACK);
}
}
public void mouseReleased(MouseEvent arg0) {
GO.setForeground(Color.yellow);
GO.setBackground(new Color(0, 0, 160));
}
}
// Classe de création de la matrice contenant tous les tirages effectués
// avec la fonction random.
// Elle est placée dans le threadMA
public class MatriceAléa implements Runnable {
private int NombreAlea;
private int nbTir, nbSer, borneS, borneI;
private int[][] resultat;
private remplissageFichier remplissageFichier;
public MatriceAléa(int nT, int nS, int bS, int bI) {
nbTir = nT;
nbSer = nS;
borneS = bS;
borneI = bI;
resultat = new int[nbTir][nbSer];
}
/**
* @param remplissageFichier
* the remplissageFichier to set
*/
public void setRemplissageFichier(remplissageFichier remplissageFichier) {
this.remplissageFichier = remplissageFichier;
}
public void run() {
for (j = 0; j < nbSer; j++) {
for (i = 0; i < nbTir; i++) {
NombreAlea = (int) (Math.random() * (borneS - borneI))
+ borneI;
resultat[i][j] = NombreAlea;
}
}
Thread threadRemplissageFichier = new Thread(remplissageFichier);
threadRemplissageFichier.start();
}
public int[][] getMatrix() {
return resultat;
}
}
// Classe de remplissage du fichier .txt qui est placé dans le threadRF
public class remplissageFichier implements Runnable {
private int nbTir, nbSer;
private MatriceAléa donnees;
public remplissageFichier(int nT, int nS) {
nbTir = nT;
nbSer = nS;
}
public void run() {
int[][] matrice = donnees.getMatrix();
String cheminFichier = enT.getText();
String sautLigne = System.getProperty("line.separator");
try {
FileWriter fileWriter = new FileWriter(cheminFichier);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (k = 1; k < nbSer; k++) {
bufferedWriter.write("Série" + k + ',');
}
bufferedWriter.write("Série" + nbSer + sautLigne);
for (l = 0; l < nbTir; l++) {
for (k = 0; k < nbSer - 1; k++) {
bufferedWriter
.write(Integer.toString(matrice[l][k]) + ',');
}
bufferedWriter.write(Integer
.toString(matrice[l][nbSer - 1])
+ sautLigne);
}
bufferedWriter.close();
RAZ = 1;
GO.setEnabled(true);
Bi.setEnabled(true);
Bs.setEnabled(true);
ser.setEnabled(true);
chemI.setEnabled(true);
enT.setEditable(true);
Bi.setEditable(true);
Bs.setEditable(true);
ser.setEditable(true);
} catch (IOException erreurEcriture) {
erreurEcriture.printStackTrace();
}
}
/**
* @param donnees
* the donnees to set
*/
public void setDonnees(MatriceAléa donnees) {
this.donnees = donnees;
}
}
// Classe de vérification des données entrées dans les JTextField
public Boolean verificationDesEntrées() {
Boolean VérifEntrées, BS true, BI true, Se = true, Ti = true, SignInt = true, SignT = true, SignSer = true, Fichier = true;
try {
borneSup = Integer.decode(Bs.getText()) + 1;
} catch (Exception e) {
BS = false;
}
try {
borneInf = Integer.decode(Bi.getText());
} catch (Exception e) {
BI = false;
}
try {
nbSerie = Integer.decode(ser.getText());
} catch (Exception e) {
Se = false;
}
try {
nbTirage = Integer.decode(tir.getText());
} catch (Exception e) {
Ti = false;
}
try {
ecrireFichier("", enT.getText(), 0);
} catch (Exception e) {
Fichier = false;
}
if (BI && BS && (borneSup - borneInf) < 0) {
SignInt = false;
}
if (Ti && nbTirage <= 0) {
SignT = false;
}
if (Se && nbSerie <= 0) {
SignSer = false;
}
if (BS && BI && Se && Ti && SignInt && SignT && SignSer && Fichier) {
VérifEntrées = true;
} else {
VérifEntrées = false;
}
revalidate();
repaint();
return VérifEntrées;
}
// Classe d'écriture dans un fichier .txt
public void ecrireFichier(String mot, String nomFichier, int c) {
FileWriter fw = null;
try {
fw = new FileWriter(nomFichier, true);
} catch (IOException e) {
GO.setEnabled(true);
GO.setBackground(Color.cyan);
Bi.setEnabled(true);
Bs.setEnabled(true);
ser.setEnabled(true);
chemI.setEnabled(true);
enT.setEditable(true);
Bi.setEditable(true);
Bs.setEditable(true);
ser.setEditable(true);
}
try {
BufferedWriter output = new BufferedWriter(fw);
output.append(mot);
if (c == 1) {
output.newLine();
}
output.flush();
output.close();
} catch (IOException io) {
GO.setEnabled(true);
GO.setBackground(Color.cyan);
Bi.setEnabled(true);
Bs.setEnabled(true);
ser.setEnabled(true);
chemI.setEnabled(true);
enT.setEditable(true);
Bi.setEditable(true);
Bs.setEditable(true);
ser.setEditable(true);
}
}
}