Empêcher un bouton de refermer une fenêtre (compliqué): sos

skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 1 mai 2008 - 23 mars 2008 à 18:11
 Utilisateur anonyme - 29 mars 2008 à 09:57

15 réponses

cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
23 mars 2008 à 18:31
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 1 mai 2008
23 mars 2008 à 20:34
Merci, mais j'ai essayé de le mettre à plusieurs endroit et rien n'y fait...
0
Utilisateur anonyme
23 mars 2008 à 22:59
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.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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"));
         
        mainPanel = new JPanel(new BorderLayout());
       
        //bouton affinage
        affinage=affin;
        affinage.setEnabled(false);
        attr = attrib;
        attr.setAffiche(true);
        //addWindowListener(this);

        largeur = larg;
        hauteur = haut;

        histo = new Histogramme(coord,borne,attrib,x0,y0,x,y);
        boutons = new Bouton(attr,affinage);
       
        JLabel histogramme = new JLabel("\n"+ System.getProperty("tborder.histogramme"));
        histogramme.setFont(new Font("arial",Font.BOLD,14));
        mainPanel.add(histogramme,BorderLayout.NORTH);
        mainPanel.add(histo,BorderLayout.CENTER);
        mainPanel.add(boutons,BorderLayout.EAST);
        setContentPane(mainPanel);
        setSize(largeur , hauteur);
        setVisible(true);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        repaint();   
    }

    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?
0

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

Posez votre question
Utilisateur anonyme
24 mars 2008 à 17:09
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){...}).

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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....

PS: Je débute en java
0
Utilisateur anonyme
24 mars 2008 à 18:32
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".

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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...
0
Utilisateur anonyme
25 mars 2008 à 06:38
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.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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é!

La prog c'est chiant
0
Utilisateur anonyme
27 mars 2008 à 12:57
Poste le message d'erreur en entier s'il te plaît.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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)
0
Utilisateur anonyme
27 mars 2008 à 19:10
Ton vecteur doit être vide à première vue.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
skystef Messages postés 16 Date d'inscription mercredi 5 avril 2006 Statut Membre Derniè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:

super();
        this.coord = coord;
        this.borne = borne;
        this.x0 = x0;
        this.x1 = x1;
        this.y0 = y0;
        this.y1 = y1;
        this.setVisible(true);
        this.attr=attr;
        //on recupere la taille des axes en pixels
        tailleAbscisse = x1-x0;
        tailleOrdonnee = y1-y0;

        //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?
0
Utilisateur anonyme
29 mars 2008 à 09:57
Précise à Eclipse où les sources se trouvent, c'est aussi simple que ça.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Rejoignez-nous