JFrame figée pendant les calculs

Résolu
cybrid27 Messages postés 14 Date d'inscription samedi 2 octobre 2010 Statut Membre Dernière intervention 22 février 2011 - 21 févr. 2011 à 18:25
cybrid27 Messages postés 14 Date d'inscription samedi 2 octobre 2010 Statut Membre Dernière intervention 22 février 2011 - 22 févr. 2011 à 17:43
Bonjour à tous !

Alors voilà, dans le cadre d'un projet d'étude statistique, je dois étudier la répartition de la fonction random en java. Pour ce faire, j'ai créé un petit programme qui fait tirer des entiers à la fonction random , les places dans une matrice puis les écrit dans un fichier texte. Jusque là, ça va.

Dans la fenêtre de mon programme, j'ai créé un genre de console (avec JTextPane) qui affiche l'avancement du programme. Par exemple, elle dit quand commence le remplissage de la matrice, quand c'est finit, etc ...
Le problème arrive quand je lance les calculs sur des matrices assez grosses : la fenêtre se fige et ne revient à elle que lorque tout est écrit dans le fichier texte. Et les infos censées s'afficher en live dans la console arrivent toutes d'un seul coup à ce moment là.

J'ai essayé de placer revalidate();repaint(); à chaque fois que j'écris quelque chose dans la console et ça marche pas. J'ai également essayé de faire this.setVisible(false);this.setVisible(true); Rien y fait.


Quelqu'un aurait-il une autre idée pour faire afficher mes informations en live dans ma console ?



Un bon matheux est un glandeur, je suis donc un génie

4 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2011 à 15:56
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);
}
}

}
3
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2011 à 09:37
Salut,

Il faut lancer tes calculs dans un thread séparé. Plusieurs méthodes fonctionnent, la mienne n'est probablement pas la meilleure au niveau du design, mais elle fonctionne :

1) Tu "réifies" ton traitement :

public class RemplissageMatrice implements Runnable {
public void execute() {
// ici tu fais ton remplissage de matrice
}
}

2) Tu lances ton calcul dans un nouveau Thread :

RemplissageMatrice remplissageMatrice = new RemplissageMatrice(monRandom, maMatrice);
Thread threadRemplissageMatrice = new Thread(remplissageMatrice);
thread.start();
0
cybrid27 Messages postés 14 Date d'inscription samedi 2 octobre 2010 Statut Membre Dernière intervention 22 février 2011
22 févr. 2011 à 14:47
Bon alors, j'ai essayé ce que tu ma proposé et ca marche pas. Mais je pense que ça vient de moi parce que avant, le programme fonctionnait quand même alors que maintenant, tout se fait instantanément et dans ma console j'obtient toutes mes commandes disant que tout s'est bien passé alors que le fichier texte créé ne contient rien.

Du coup, je t'envoi tout mon code pour que tu essaye de me dire ou j'ai merdé avec les thread (j'en ai mis 2 : un pour le remplissage de la matrice et un pour le remplissage du fichier texte).






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.JScrollPane;
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);

}

}


//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);

// Création de la console intéractive

private Console res = new Console(Color.black); // classe placée dans un autre fichier
private JScrollPane scroll = new JScrollPane(res);

// 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;

// Placement du remplissage de la matrice et du remplissage de fichier dans des threads séparés

private MatriceAléa données = new MatriceAléa(borneSup,borneInf,nbTirage,nbSerie);
private Thread threadMA = new Thread(données);
private remplissageFichier fichierDeDonnées = new remplissageFichier(nbTirage,nbSerie);
private Thread threadRF = new Thread(fichierDeDonnées);


// 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);
res.setBackground(new Color(25,25,25));


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);


scroll.setBounds(5, 615, 984, 252);
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);
add(scroll);


res.setEditable(false);

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);

scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
res.append("------------------------------------------------------------------------------ INFORMATIONS PREALABLES --------------------------------------------------------------------------"+'\n'+'\n'+'\n'+
"\t\t\t ** Remplissez les zones de texte avant de cliquer sur le bouton. **"+'\n'+
"\t\t ** Veuillez n'entrer que des ENTIERS RELATIFS pour les bornes de l'intervalle de tirage. **"+'\n'+
"\t\t ** Veuillez n'entrer que des ENTIERS NATURELS pour le nombre de séries et le nombre de tirages. **"+'\n'+
" ** Si une erreur se produit lors de la création du fichier, elle sera affichée dans CETTE CONSOLE avec des conseils pour y remédier. **"+'\n'+
" ** ATTENTION : Le temps de création du fichier de données sera d'autant plus important que le nombre de données à y inscrire sera grand. **"+'\n'+
"\t\t ** ATTENTION : il est déconseillé de dépasser 1 000 000 de données par fichier .txt créé. **"+'\n', "com");

chemI.setFocusable(false);
GO.setFocusable(false);
res.setFocusable(true);
res.grabFocus();
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);
res.grabFocus();

if(RAZ == 1)
{
res.setText("");
RAZ--;
}
res.append("Vérification des informations entrées ...."+'\n', "norm");

if(verificationDesEntrées() == true)
{
res.append("Création d'une matrice de données aléatoires en cours ..."+'\n', "norm");
threadMA.start();
}
else
{
res.append("Impossible de créer le fichier de données. Veuillez corriger les informations que vous avez entré avant de recliquer sur le bouton. Vérifiez notamment que vous n'avez entré que des entiers."+ '\n',"avert");
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);
res.grabFocus();
}
}

public void mouseReleased(MouseEvent arg0)
{
GO.setForeground(Color.yellow);
GO.setBackground(new Color(0,0,160));
res.grabFocus();
}

}


// 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 = new int[nbTir][nbSer];


public MatriceAléa(int nT,int nS,int bS,int bI)
{
nbTir=nT;
nbSer=nS;
borneS=bS;
borneI=bI;
}



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;
}
}
res.append("==>","norm");
res.append(" Données créées !"+ '\n',"succ");
res.append("Création du fichier en cours ..."+ '\n',"norm");
threadRF.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;



public remplissageFichier(int nT,int nS)
{
nbTir=nT;
nbSer=nS;
}



public void run()
{
for(k=1;k<nbSer;k++)
{
ecrireFichier("Série"+k+',',enT.getText(),0);
}
ecrireFichier("Série"+nbSer,enT.getText(),1);


for(l=0;l<nbTir;l++)
{
for(k=0;k<nbSer-1;k++)
{
ecrireFichier(String.valueOf(données.getMatrix()[l][k])+ ',',enT.getText(),0);
}
ecrireFichier(String.valueOf(données.getMatrix()[l][nbSer-1]),enT.getText(),1);
}
res.append("==>","norm");
res.append(" Fichier créé avec succès !!!"+ '\n',"succ");
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);
}



}

// 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)
{
res.append("ERREUR : Borne supérieure de l'intervalle de tirage incorrecte." + '\n', "erreur");
BS=false;
}

try
{
borneInf = Integer.decode(Bi.getText());
}
catch(Exception e)
{
res.append("ERREUR : Borne inférieure de l'intervalle de tirage incorrecte." + '\n', "erreur");
BI=false;
}

try
{
nbSerie = Integer.decode(ser.getText());
}
catch(Exception e)
{
res.append("ERREUR : Nombre de séries incorrect." + '\n', "erreur");
Se=false;
}

try
{
nbTirage = Integer.decode(tir.getText());
}
catch(Exception e)
{
res.append("ERREUR : Nombre de tirages incorrect." + '\n', "erreur");
Ti=false;
}

try
{
ecrireFichier("",enT.getText(),0);
}
catch(Exception e)
{
Fichier=false;
}


if(BI && BS && (borneSup-borneInf)<0)
{
res.append("ERREUR : Intervalle de tirage incorrect : La borne supérieure est plus petite que la borne inférieure." + '\n', "erreur");
SignInt = false;
}
if(Ti && nbTirage<=0)
{
res.append("ERREUR : Nombre de tirages négatif ou nul." + '\n', "erreur");
SignT = false;
}
if(Se && nbSerie<=0)
{
res.append("ERREUR : Nombre de séries négatif ou nul." + '\n', "erreur");
SignSer = false;
}

if(BS && BI && Se && Ti && SignInt && SignT && SignSer && Fichier)
{
VérifEntrées = true;
res.append("==>", "norm");
res.append(" OK"+'\n', "succ");
}
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)
{
res.append("ERREUR : chemin de sortie incorrect." +'\n', "erreur");
res.append("Veuillez entrer un chemin valide pour le fichier à créer avant de recliquer sur le bouton."+'\n', "avert");

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)
{
res.append("ERREUR : impossible d'écrire dans le fichier de sortie"+'\n', "erreur");
res.append("Veuillez vérifier que le nom du fichier n'est pas déjà utilisé dans ce répertoire ou que vous n'avez pas ajouté une extension différente de .txt"+'\n', "avert");

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);
}


}

Un bon matheux est un glandeur, je suis donc un génie
0
cybrid27 Messages postés 14 Date d'inscription samedi 2 octobre 2010 Statut Membre Dernière intervention 22 février 2011
22 févr. 2011 à 17:43
J'ai réésayé ta correction avec la console et ça marche comme sur des roulettes. Ton observation sur mes ouvertures/fermetures de flux était tout à fait juste : mon PC met 5secondes à créer une matrice de 10000*10000
et à l'écrire dans le fichier texte avec ce que tu me propose. Avant il mettait 15min avec ma classe ecrireFichier.

J'ai vu aussi les erreurs que tu a souligné. En effet, ce sont de grosses fautes auxquelles je ferait attention la prochaine fois.

Sinon, pour répondre à ta question, je ne suis pas dans une filliaire de génie logiciel mais ce n'est pas loin : je suis élève ingénieur en 2ème année. L'année prochaine je rentre au département "architecture des systèmes d'information" et le Java est un des languages que l'on nous demande de maitriser

En tout cas, MERCI GRANDEMENT pour ton aide, elle m'a été très précieuse !




Un bon matheux est un glandeur, je suis donc un génie
0
Rejoignez-nous