Empêcher un bouton de refermer une fenêtre (compliqué): sos
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008
-
23 mars 2008 à 18:11
Utilisateur anonyme -
29 mars 2008 à 09:57
A voir également:
Empêcher un bouton de refermer une fenêtre (compliqué): sos
Chabour a raison. Donne nous plus de détails si tu veux de l'aide. Sa solution fonctionne. Si tu utilises sa méthode appliquée sur ta fenêtre (JFrame), quand tu vas essayer de la fermer, ça ne fera rien.
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 24 mars 2008 à 15:39
Voici plus de détails...
J'ouvre une fenêtre dans mon prgramme qui est codée de la façon suivante: En fait, les développeurs ajoute un objet histogramme et un objet bouton qui contient deux boutons. Si on clique sur l'un deux, ça ferme la fenêtre et je reviens à mon programmme.
J'ai essayé de mettre this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); dans le WinowClosing ou dans le code de la fenêtre. Rien n'y fait.
public class Fenetre extends JFrame implements WindowListener
//public class Fenetre extends JFrame
{
private JPanel mainPanel;
private Histogramme histo;
private Bouton boutons;
private int largeur , hauteur;
private JButton affinage;
private Attribut attr;
/*
*constructeur
*@param coord - coordonnees des differents points
*@param borne - bornes des classes
*@param x0 - position x0
*@param y0 - position y0
*@param x - position de la fin de l'abscisse
*@param y - position de la fin de l'ordonnée
*@param detailAttr - detail de l'attribut courant
*@param typeGraphe - le type du graphe
*@param largeur - taille de l'axe des abscisses
*@param haut - taille de l'axe des ordonnées
*/
public Fenetre(Vector coord,Vector borne,int x0,int y0,int x,int y,
Attribut attrib,int larg , int haut , JButton affin)
{
super(System.getProperty("affinage.name"));
public void windowClosing(WindowEvent e) {affinage.setEnabled(true);attr.setAffiche(false);}
public void windowOpened(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {this.setVisible(true);}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
}
J'ai essayé de le placer dans le code du bouton:
public void actionPerformed(ActionEvent e)
{
// Si on valide notre affinage
if(e.getSource() == valider)
{
valider();
}
/* Si on annule
* On remet tout à zéro
*/
if(e.getSource()== annuler)
{
attr.setStatus(0);
attr.aPreparer = true;
attr.setPoints(new Vector());
attr.setBornes(new Vector());
attr.setBornesInitiales(new Vector());
// Pour le bouton affinage
attr.setAffiche(false);
affinage.setEnabled(true);
this.getTopLevelAncestor().setVisible(false);
//this.getTopLevelAncestor().repaint();
}
}
notament au niveau de l'évènement "annuler". C'est ça qui me ferme ma fenêtre this.getTopLevelAncestor().setVisible(false); mais si je le met à true, là ça ne la ferme plus mais ça ne réinitialise pas mon histogramme. J'ai pensé à une astuce: existe-t-il un code permettant de fermer puis réouvrir la fenêtre?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Déjà ça n'a aucun sens de mettre ça dans windowClosing (appelé quand tu fermes la fenêtre) puisque setDefaultCloseOperation sert à définir une opération exécutée par défaut à la fermeture. Apprends à lire la documentation, setVisible sert à rendre (in)visible un composant. Si je comprends bien, tu veux juste que ton bouton "annuler" réinitialise ton IHM. Je ne vois pas ce qui dans ton code est sensé réinitialiser ton histogramme. "attr" est sensé être égal à "attrib"? Si tu veux que la fenêtre ne puisse pas se refermer quand tu cliques sur le bouton X au coin de ta fenêtre, tu dois en effet utiliser la méthode setDefaultCloseOperation. Si tu veux que la fenêtre ne se ferme pas ni ne soit temporairement cachée, n'utilise pas setVisible(false). Il faut que ton bouton déclenche la remise à jour du modèle de l'histogramme, que la vue de l'histogramme observe les changements du modèle et les répercute (tu peux faire alors un appel à repaint() dans l'histogramme ou bien faire histogramme.repaint() à la fin du bloc if(e.getSource()== annuler){...}).
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 24 mars 2008 à 17:56
Oki, mais je ne peux pas rafraîchir l'histogramme depuis le code du bouton, il ne connaît pas l'objet histo de Fenêtre.java. J'ai essayé un repaint(). En fait, je ne vois pas comment le code gérant les boutons dans Bouton.java peut faire quelque chose avec les objets de Fenêtre.java....
Tu dois t'arranger pour que le code du bouton ait une référence sur l'histogramme directement ou alors indirectement en passant par une instance de la classe Fenetre et en utilisant un accesseur.
P.S : j'ai bien compris que tu es débutant, ça ne sert à rien de mettre "(compliqué) : sos".
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 24 mars 2008 à 22:57
Alors, j'ai essayé de passer au bouton une référence sur l'histogramme et le bouton. Et dans le code de "annuler", j'ai fait repaint() sur l'histogramme et la fentre.Il ne se passe rien... Comme s'il fallait recréer éxecuter tout le code de la fenêtre à nouveau... (c'est ce qu'on fait par défaut, on ferme et on réouvre.
Pourtant, le code actuel de "annuler" réinitialise bien l'histogramme...
C'est ce que je craignais. La vue de l'histogramme ne tient pas compte (ou très mal) des changements du modèle de l'histogramme dans ton cas. Ca vient de ta classe Histogramme. Cependant, dans ton code du bouton, "attr" doit faire référence aux attributs de l'histogramme sinon ça veut dire que tu modifies un truc en l'air qui est déconnecté de tout. Il faut peut-être aussi que tu redéfinisses les méthodes paint() et update() dans ta classe Histogramme pour que ton repaint() fasse ce que tu attends mais ça, ce n'est peut-être pas nécessaire.
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 27 mars 2008 à 09:23
Ok. merci pour es tuyaux. Cela dit, la classe Histogramme est également utilisée dans l'interface du programme et pas seulement dans cette maudite fenêtre. la méthode Paint() de l'histogramme s'occupe de tracer un graphique différent. Le constructeur de l'histogramme lui c'est seulement un appel à une autre fonction d'une classe parente: super(coord , borne ,attr, x0 , y0 , x1 , y1);
En fait c'est le graphique de l'interface principale auquel on rajouter des barres et des petits piquets que l'on peut déplacer pour changer les intervalles afin d'avoir un histogramme "dynamique".
J'ai essayé une méthode de bricolage mais sans sucès bien sur, j'ai créé dans Fenetre une méthode refresh qui construit une nouvelle fenêtre (même appel que dans l'interface principale du programme. Malheureusement, la fenêtre s'ouvre mais reste vide ou alors on voit l'axe des abcisses... et tout ce bloque avec des messages d'erreurs dans la console :
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Je vais essayer de faire une méthode update().... vite du café!
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 27 mars 2008 à 13:46
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at graphique.Bouton.valider(Bouton.java:125)
at graphique.Bouton.actionPerformed(Bouton.java:83)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
skystef
Messages postés16Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 1 mai 2008 29 mars 2008 à 09:50
J'ai décidé de recoder cette maudite fenêtre, tout en utilisant ce qui a déjà été fait. Le mieux je pense et que je puisse arriver à recréer un histogramme, effacer celui qui est dans la fenêtre et mettre le nouveau à sa place.
Le soucis, c'est que je suis incapable de comprendre comment le code s'enchâine et le débogger pas à pas saute certaines parties. Je m'explique:
Quand on crée un histogramme, on appelle le constructeur comme suit: histo = new Histogramme(coord,borne,attrib,x0,y0,x,y);
Jusque là tout va bien. Sauf que voici le code du constructeur (histogramme.java): super(coord , borne ,attr, x0 , y0 , x1 , y1); qui appelle le constructeur de Repere.java qui ne fait que ça:
//le panel doit capturer les evenements de souris
this.addMouseMotionListener(this);
this.addMouseListener(this);
//pour ne pas afficher des nombres avec 36 chiffres apres la virgule
f.setMaximumFractionDigits(2);
Avec le déboggeur d'eclipse, arrivée à super(), il marque qu'il ne trouve pas la source. Après un nouveau clic, il m'envoie à une méthode Paint() de l'Histogramme qui le dessine. Mais Paint() prend un graphique G, et je ne trouve pas où est instancé ce graphique.....
Il n'y a pas moyen de voir avec Eclispe qui appelle les fonctions?