pyrokana
Messages postés5Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention21 janvier 2005
-
20 janv. 2005 à 12:44
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 2009
-
21 janv. 2005 à 14:35
Avant de poser cette question, j'ai fait des recherches sur le net et il n'y a rien qui parle de ce probleme qui à priori parait simple : lorsque je mets l'appel de la methode showOpenDialog dans ma boucle , l'affichage ne se fait pas
try
{
System.out.print("> ");
String s = br.readLine();
while (!(s.equals("quit")))
{
if (s.equals("open"))
{
fc.showOpenDialog(frame);
}
System.out.print("> ");
s = br.readLine();
}
}
le "if" fonctionne tres bien.
en mettant la methode à different endroits de ce code, je m'apercois que le readline est le responsable. Est ce que quelqun aurait une explication ou eventuellement un autre moyen qui permet de lire une chaine de caractere et qui ne causerais pas ce probleme ?
merci d'avance ... car je tourne vraiment en rond la ...
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 20 janv. 2005 à 13:54
Salut,
il faudrait mettre ta boucle de lecture dans un thread séparé.
Je te donne la structure du truc, j'ai fait un essai qui semble marcher :
public class MaClasse implements Runnable{
//...
private Thread thread;
//...
public Maclasse(/*...*/){
//...
start();
}
public void start() { if (thread null) thread new Thread(this);
thread.start();
}
public void stop() { if (thread !null) thread null;
}
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
JFileChooser fc = new JFileChooser();
//fc.set.......
try{
System.out.print("> ");
String s = br.readLine();
while (! (s.equals("quit"))) {
if (s.equals("open")){
int resultat = fc.showOpenDialog(this);
if (resultat == fc.APPROVE_OPTION)
System.out.println(fc.getSelectedFile());
}
System.out.print("> ");
s = br.readLine();
}
stop();
System.exit(0);
}
catch (Exception e) {}
}
}
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
pyrokana
Messages postés5Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention21 janvier 2005 20 janv. 2005 à 16:08
A la compile, il naccepte pas le showOpenDialog(this) car lobjet a envoyer pour cette methode est de type components . Donc jai essayer plusieurs choses :
avec des extends (component puis JFrame) + super()
en declarant une JFrame et en la passant en parametre mais la , le prog bloque de la meme facon quavant.
Est ce que tu nas pas oublie quelque chose dans ton exemple ?
Pyro
PS : en tout cas je te remercie de mavoir repondu si rapidemment
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 20 janv. 2005 à 17:03
Oui, c'était juste une structure à réutiliser...
Il faut juste que tu lui donne la Frame de base du Dialog...
dans ton cas, il suffirait sans doute que ta classe implemente Runnable,
et que tu recopies le contenu de mon machin,
en mettant fc.showOpenDialog(frame); plutôt que ...(this);
Je te donne un exemple complet (enfin, j'espère) :
"open" affiche une boîte de dialogue, et si tu choisis un fichier, il est affiché dans la console.
Salut !
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
public class Truc extends JFrame implements Runnable{
private Thread thread;
public Truc() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();//construction de la fenêtre
start();//démarrer le thread
}
catch(Exception e) {
e.printStackTrace();
}
}
public void start() { if (thread null) thread new Thread(this);//thread est construit sur cette implémentation de Runnable
thread.start();//appelle run()
}
public void stop() { if (thread !null) thread null;
}
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
JFileChooser fc = new JFileChooser();
System.out.print("> ");
String s = br.readLine();
while (! (s.equals("quit"))) {
if (s.equals("open")){
int resultat = fc.showOpenDialog(this);//affiche un dialogue, et récupère le résultat (le programme est bloqué tant que le dialogue n'est pas fermé (est-ce ton problème ?, en tout cas, c'est normal !)
if (resultat == fc.APPROVE_OPTION)
System.out.println(fc.getSelectedFile());
}
System.out.print("> ");
s = br.readLine();
}
stop();
System.exit(0);
}
catch (Exception e) {}
pyrokana
Messages postés5Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention21 janvier 2005 20 janv. 2005 à 17:56
Tu viens juste de mettre le doigt dessus.
Si tu enleves fen.setVisible(true); bein le shopOpenDialog ne fonctionne plus.
en temps normal, ce JFileChooser n'a pas besoin d'un setVisible sur la frame pour s'afficher. la methode showOpenDialog suffit a elle meme ... seulement dans ce cas precis le dialog ne s'affiche pas. Il y a donc un probleme de chargement du dialog car si tu mets un showOpenDialog avant le premier readline bein au deuxieme appel (if .. "open") la fenetre s'affiche (et sans le setVisible).
Tu connais eventuellement un moyen pour charger la frame sans qu'elle soit visible ou un moyen pour charger un objet dialog ? (d'apres ce que j'ai vu, c'est le readline qui fout la merde pour permettre le chargement du dialog)
Pyro
PS1 : le but, c'est justement d'eviter d'afficher une frame supplementaire.
PS2 : je suis desole je t'en demandes beaucoups et je te remercie encore de te demmener pour moi . j'ai commencer java ya quelques semaines et je suis buté, je ne veux pas laisser tomber cette deuxieme appli qui va me permettre de connaitre mes premiers objets liés au reseau. C'est bete, je bute sur une histoire d'entrée-sortie
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 20 janv. 2005 à 18:33
Héhé, il y a une solution toute bête ^^
Il n'y a même pas besoin de thread (je pensais que le problème était plus complexe)
la méthode showDialog peut accepter un paramètre null ^^
Voici donc une nouvelle version de Truc, bien plus simple
T'en fais pas, si je passe sur le forum aujourd'hui, c'est que j'ai le
temps (fin de partiels dans mon école, une "petite" soutenance de
projet demain, et un W.E. de vacance )
Dobel
[Une fois rien, c'est rien; deux fois rien,
ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà
s'acheter quelque chose, et pour pas cher]
-----------------------
//encore Truc.java
import java.io.*;
import java.lang.*;
import javax.swing.*;
public class Truc {
public Truc() {
run(); //j'ai pas renommé...
}
public void run() {
try{
BufferedReader br = new
BufferedReader(new
InputStreamReader(System.in));
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 21 janv. 2005 à 13:03
Ca marche sans problème chez moi, par contre, ce qui peut arriver, c'est que le Dialog apparaisse derrière ta console ou les autres fenêtres.
Je ne sais pas comment remédier à ce problème.
A+
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
[OUAIS ! Fin des partiels ^^]
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 21 janv. 2005 à 13:55
Bon, si, j'ai une solution, c'est pas la finesse, mais ca marche :
Je redéfinie le JFileChooser, de telle sorte que lorsque le Dialog devient visible, alors il le passe au premier plan avec la méthode monJDialog.toFront()
Je te remet le même exemple, modifié.
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
JFileChooser fc = new JFileChooser() {//On redéfinit une partie de la classe JFileChooser
protected JDialog createDialog(Component parent) {//redéfinition de la méthode createDialog
JDialog leDial = super.createDialog(parent);//on créé le Dialog avec la méthode d'origine
leDial.addWindowListener(new WindowAdapter(){//On lui rajoute un Listener (voir doc de la Classe WindowAdapter), ...
public void windowOpened(WindowEvent e) {//...qui va écouter l'ouverture du dialogue...
((JDialog) e.getSource()).toFront();//...et le placer devant.
}
});
return leDial;
}
};
System.out.print("> ");
String s = br.readLine();
while (! (s.equals("quit"))) {
if (s.equals("open")){
int resultat = fc.showOpenDialog(null);
if (resultat == fc.APPROVE_OPTION)
System.out.println(fc.getSelectedFile());
}
System.out.print("> ");
s = br.readLine();
}
System.exit(0);
}
catch (Exception e) {}
}
public static void main(String[] args) {
new Truc();
}
}
pyrokana
Messages postés5Date d'inscriptionmercredi 1 novembre 2000StatutMembreDernière intervention21 janvier 2005 21 janv. 2005 à 14:23
Je vais essayer ta nouvelle solution;
Par contre, je sens que tu vas pas rire : ta solution precedente marche, comme toutes les autres. J'ai relancé à 12H ton avant derniere solution, hop => open, pi rien ... :(
l'heure du casse croute, je vais à la boulangerie , je mange tranquillement, je reviens à ma place et en faisant differentes petites choses, je m'apercois que la fenetre est la :? ...
Bein en fait, le probleme etait trop simple pour que cela soit ca, le JVM etait tout simplement lent à charger les differents paquetages (il met vraiment tres longtemps pour le chargement). donc je quitte l'appli , je re-rentres et pi la , l'affichage est instantanée.
Je te remercie pour toute ton aide ... et surtout m'en veux pas ...
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 21 janv. 2005 à 14:35
^^
t'as quoi comme machine, sur quel système ^^ ?
en tout cas, ca m'a occupé pdt mon temps libre ^^
Il y a tout de même sous windows le problème de la boîte de Dialogue qui n'apparaît pas en haut, si elle tu utilises showOpenDialog(null), et mon dernier exemple donne une solution, donc, j'ai pas fait tout ca pour rien ^^
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]