JFileChooser probleme ...

pyrokana Messages postés 5 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 21 janvier 2005 - 20 janv. 2005 à 12:44
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 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 ...

10 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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]
0
pyrokana Messages postés 5 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 21 janvier 2005
20 janv. 2005 à 16:08
A la compile, il n’accepte pas le showOpenDialog(this) car l’objet a envoyer pour cette methode est de type components . Donc j’ai 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 qu’avant.

Est –ce que tu n’as pas oublie quelque chose dans ton exemple ?

Pyro

PS : en tout cas je te remercie de m’avoir repondu si rapidemment
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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]

------------------

//Truc.java
import java.io.*;
import java.lang.*;
import java.awt.*;
import javax.swing.*;

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

}
private void jbInit() throws Exception {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(new Dimension(400, 300));
this.setTitle("Bibi was here");
}

public static void main(String[] args) {
Truc fen = new Truc();
fen.setVisible(true);
}

}
0
pyrokana Messages postés 5 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 21 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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));


JFileChooser fc = new JFileChooser();





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


}


}
0
pyrokana Messages postés 5 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 21 janvier 2005
21 janv. 2005 à 12:36
euhhh .. j'avais deja essayé avec null mais rien à faire le dialog ne s'affiche pas ... je crois que nous venons de trouver un probleme insoluble :(

Ca marche chez toi ?
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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 ^^]
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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]

--------------------------------

import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.lang.*;
import javax.swing.*;

public class Truc {
public Truc() {
run();
}


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();
}
}
0
pyrokana Messages postés 5 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 21 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 ...
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
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]
0
Rejoignez-nous