Bonjour, j'ai une JDialog qui fonctionne très bien mais lors d'un clic sur une autre fenetre, elle passe au second plan et l'on est obligé de farfouiller partout pour réussir à l'attraper la coquine. J'ai lu sur le forum des trucs intéressant mais j'avoue ne pas avoir compris le code: http://www.javafr.com/forum.v2.aspx?id=233608. Si qqun peut m'aider... c histoire de rendre mon prog plus agréable. Merci
En fait je la déclare déja comme ceci (enfin je crois que c la meme chose):
super(parent, "Configuration", true);
mais dans ce cas, si on change de fenetre et que l'on revient ensuite dessus en cliquant dans la barre des taches, la fenetre générale revient mais la JDialog est planquée en dessous. J'aimerais qu'elle revienne directement au premier plan ou alors que la JDialog s'ajoute dans la barre des taches (on pourrait alors cliquer directement dessus). En tout cas merci quand meme.
je suis aussi en stage, je doit developper un logiciel..et c'est vrai que mon appli a le meme comportement que le tien!!
Et a y reflechir, c'est un peu un probleme!!
Alors je me joint a toi en attendant une reponse claire....
Il y a peut-être une solution en mettant un WindowListener (ou autre)
sur la fenêtre mère, et en demandant de repasser le JDialog devant avec
sa méthode toFront();
mais bon, c'est surtout pour rapeller que le problème n'est pas trivial, car il dépend du Window-Manager de l'OS...
le comportement ne sera certainement pas le même sous Windows, sous
Solaris, ou sous Linux avec Gnome, KDE ou Fluxbox ou.........
il me semble d'ailleurs qu'il y a des avertissements dans la doc java,
pour prévenir que les comportements des méthodes toFront ou autres sont
incertains.
Pour ce qui est de la source que tu cites au dessus, je pense qu'il
sagit d'une méthode à mettre dans la classe JDialog, pour faire
apparaître une boîte de dialogue (enfin, j'essaye de deviner )
j'ai aucune idée de si ça marche :p, et si ça marche, je ne vois pas du tout pourquoi
en gros (je tape en live) :
class Message extends JDialog {
public Message (Frame frame, String titre) {
super(frame, titre, true); //pour la créer modale
}
public static void afficherMessage(Component parent, String titre, String message) {
Component frame = parent;
while (frame !=null && !(frame instanceof Frame) )
frame = frame.getParent (); //on remonte les parents, jusqu'à trouver une Frame
//on créé une boîte de cette classe Message
Message boite = new Message(frame, titre);
//on peut continuer la boîte ici, rajouter des boutons, afficher la String message, etc...
//...................
//dans le code que tu cites, il termine par ça, mais je ne sais pas si c'est nécessaire
boite.setResizable(false);
boite.pack();
boite.show();
}
}
et donc, tu utilises plus loin en faisant par exemple
Message.afficherMessage(this, "Bibi was here", "Hello World !");
voilà, j'espère juste ne pas avoir écrit des grosses co*****es
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]
Bon, c'est pas facile pour tester, comme je n'ai pas le problème sous Linux (comment ça, de la propagande ?? )
bon, j'ai quand même tenté quelques petites choses.
Ce que je voulais faire au début, c'était utiliser les évènements
WindowActivated ou WindowDeActivated de WindowListener, sur la fenêtre
parente, pour repasser le dialog devant. Mais en fait, ces évènements
sont bloqués lorsque le dialogue est modal (logique...).
Je te propose donc la même chose, mais avec un dialog non modal...
c'est tapé rapidement sous JBuilder, donc c'est pe pas génial, mais bon...
c'est un cadre, lorsque tu cliques dessus, il ouvre un JDialog non
modal, et dès que le cadre est réactivé (en cliquand dessus par
exemple), il demande à placer le Dialog devant avec toFront(); (je
rapelle que toFront ne fonctionne pas systématiquement !)
sur mon Linux, ça ramène systématiquement le Dialog devant. Après, faut voir si c'est génant qu'il ne soit pas modal.
<hr size="2" width="100%">
public class Cadre1
extends JFrame implements WindowListener{
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();
JDialog dial;
public Cadre1() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
catch (Exception exception) {
exception.printStackTrace();
}
}
/**
* Initialisation du composant.
*
* @throws java.lang.Exception
*/
private void jbInit() throws Exception {
contentPane = (JPanel) getContentPane();
contentPane.setLayout(borderLayout1);
setSize(new Dimension(400, 300));
setTitle("Titre du cadre");
contentPane.addMouseListener(new
Cadre1_contentPane_mouseAdapter(this));//un écouteur sur le container
du cadre.
this.addWindowListener(this);
}
public void contentPane_mouseClicked(MouseEvent e) {
if (dial ==null || !dial.isVisible()) {// si le dialog n'existe pas déjà, on en créé un
//bon, pas très propre, mais voilà les évènements de WindowListener
public void windowOpened(WindowEvent e) {
System.out.println("opened");
}
public void windowClosed(WindowEvent e) {
System.out.println("closed");
}
public void windowClosing(WindowEvent e) {
System.out.println("closing");
}
public void windowDeactivated(WindowEvent e) {
System.out.println("deactivated");
}
public void windowDeiconified(WindowEvent e) {
System.out.println("deiconified");
}
public void windowActivated(WindowEvent e) {
System.out.println("activated");
if (dial != null) {
System.out.println("là !!");
dial.toFront();
}
}
public void windowIconified(WindowEvent e) {
System.out.println("iconified");
}
}
//c'est l'écouteur de la fenêtre principale
class Cadre1_contentPane_mouseAdapter
extends MouseAdapter {
private Cadre1 adaptee;
Cadre1_contentPane_mouseAdapter(Cadre1 adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.contentPane_mouseClicked(e);
}
}
<hr size="2" width="100%">
pour l'autre méthode, c'est pas la peine que je teste, comme j'ai pas le problème sous Linux :)
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]
ok merci suis sur un autre truc en ce moment (une histoire policière sanglante avec d caretListener et d setDot() qui veulent pas marcher) et je vais essayer de rester concentré dessus. D'ici la fin de la semaine je répond pour te confirmer que ça marche bien...
Je sens que je vais etre obligé de poster encore. En tout cas merci bcp Dobel
Un stage c bien mais là ya d jours où ça marche pas
Axi