Salut tout le monde,
Je suis en train de développer une interface en java et bien que je suis sur la fin de mon travail, j\'ai un petit problème pour réaliser ce que je veux.
Voila mon probs... j\'ai une fenetre principale qui lorsque l\'utilisateur appuis sur un bouton \"ok\" lance la fabrication d\'un fichier xml dans une autre class... certaine des donnée prise en compte dans ce fichier xml nécéssite 3 attributs en + a remplir et je voulais implémenter une fenetre qui souvre et permette de saisir ces 3 attributs lorsque le type donnée est rencontré lors de la fabrication du (fichier).
en gros ma class qui fabrique le fichier xml doit se stopper lorsque cette fenetre apparait et continué lorsque l\'utilisateur a validé la saisie de ces 3 attributs.
J\'ai donc essayé plusieur méthodes... et ais même regardé pas mal de site et tutos sur les Thread en swing, mais ca ne marche pas l\'EDT (gestionnaire de thread pour swing) m\'envois ce message lorsque j\'essais d\'utiliser nvokeAndWait, Cannot call invokeAndWait from the event dispatcher thread
Pour donner un exemple simple, voici un petit programme que j\'ai réalisé et qui reproduit ce que j\'ai fait dans mon projet... ici une fenetre principale permet de lancer une tache (lecture d\'un tableau de 12 int (123412341234) ) lorque l\'on appuis sur le bouton \"ok\". lors de la lecture de ce tableau, cette tache s\'arrete lorsque 4 est rencontré dans le tableau (donc ici elle devrait s\'arreter 3 fois) et ouvre une fenetre. Cette tache devrait donc s\'arreter et reprendre lorsque l\'utilisateur valide cette fenetre, pour bien voir si cela marche j\'ai introduit un System.ou.println qui envois \"prout\" apres avoir valider cette fenetre pour bien voir si la tache s\'arrete et reprend apres... mais mon erreur subsiste et lors de l\'invocation de cette fenetre l\'edt deconne.. bref voici le prog (composé de 3 class)
/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////Class creant la fenetre principale////////////////////////////////////////////////
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Threadswingtest extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1;
//Threadswingtest constructeur, assemble la fenetre principal
public Threadswingtest()
{
super(\"Threadswingtest\");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JLabel label = new JLabel(\"PRINIPAL FRAME\");
JPanel control = new JPanel(new FlowLayout());
control.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
JButton ok = new JButton(\"Ok\");
ok.setMaximumSize(new Dimension (150,25));
ok.setActionCommand(\"ok\");
ok.addActionListener(this);
control.add(ok);
panel.add(label,BorderLayout.NORTH);
panel.add(control,BorderLayout.SOUTH);
this.setContentPane(panel);
this.pack();
this.setVisible(true);
}
//methode permettant de lancer une action lorsque le boutton est clické
public void actionPerformed(ActionEvent e)
{
JButton source = (JButton) e.getSource();
if(source.getActionCommand()==\"ok\")
{
Classbidon cb = new Classbidon();
}
}
//methode permettant d\'obtenir Threadswingtest implementent runnable et etre en ThreadSafe
private static void createAndShowGUI()
{
Threadswingtest tst = new Threadswingtest();
tst.setLocationRelativeTo(null);
}
//main..
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////Class avec la tache bidon lecture du tableau///////////////////////////////////
public class Classbidon
{
private int [] tableau = {1,2,3,4,1,2,3,4,1,2,3,4};
public Classbidon()
{
int i;
for(i=0;i<12;i++)
{
System.out.println(tableau [i]);
if(tableau[i]==4)
{
try
{
javax.swing.SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
System.out.println(\"prout\");
}
catch(Exception e)
{
}
}
}
}
private static void createAndShowGUI()
{
Inputview iv = new Inputview();
iv.setLocationRelativeTo(null);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////Class creant la fenetre qui devrait bloquer la tache///////////////////////////
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Inputview extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1;
public Inputview()
{
super(\"Inputview\");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(1,0,5,5));
JLabel label = new JLabel(\"4\");
JButton close = new JButton(\"Close\");
close.setMaximumSize(new Dimension(150,25));
close.setActionCommand(\"close\");
close.addActionListener(this);
panel.add(label);
panel.add(close);
this.setContentPane(panel);
this.pack();
this.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
JButton source = (JButton)e.getSource();
if(source.getActionCommand()==\"close\")
{
this.dispose();
}
}
}
Donc voila, comme ca vous pourrez voir le résultat directement et me donner votre avis sur la méthode a employer pour résoudre ce problème. j\'ai déjà essayé de résoudre ca avec nue boucle d\'attente dans la class qui lit le tableau,
en attente d\'un événement qui serait déclenché par la fenetre bloquante, mais soit je bloque le thread principal de l\'edt et mes fenetres freezent carrement,
sinon ca m\'envois l\'erreur que vous voyé dans ce programme test.. Je pense que je ne suis pas trés loin de la soluce dans mon exemple mais ayant trés peu ll\'habitude des threads en java et swing... j\'ai due mal faire mon truc ^^.
Donc si quelqu\'un connait le truc.. ou vois l\'erreur faite dans mon programme test, je le remercie d\'avance, c\'est assez urgent comme c\'est pour un stage :p.
Et d\'un autre coté en ayant fouiller partout je n\'est pas trouvé un exemple concret de ce que je voulais, ou tout simplement d\'exemple parlant en thread swing me permettant de trouver une solution.
Merci d\'avance et a bientot pour voir vos réponses
__________________________
Satelite
bah si j'ai bien compris en réalité tu veux une fenetre qui s'ouvre et qui bloque ton application derrière?
pour ça utilise joptionpane. (euh c'est bien ça au moin?)
__________________________
rien ne sert de coder pour coder il suffit de coder à point. La fontaine (ah non c'est pas ça qu'il a dit?)