Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVA] les événements

encore un probleme !!

    29 janvier 2006 à 16:27:37

    Bonjour à tous



    J'ai encore un probleme avec les fenetres mais cela concerne plus maintenant les evénements
    voici mon code
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    ////////////////////////////////
    class MaFenetre extends JFrame implements ActionListener
    {
            public MaFenetre()
            {
                    setTitle("Fenetre");
                    setBounds(50,50,300,200);
                    Container contenu = getContentPane();
                    // panneau
                    JPanel pan = new Panneau();
                    pan.setBackground(Color.yellow);
                    getContentPane().add(pan);
                    // rectangle
                    JButton rectangle = new JButton("Rectangle");
                    contenu.add(rectangle,"North");
                    rectangle.addActionListener(this);
                    // ovale
                    JButton ovale = new JButton("Ovale");
                    contenu.add(ovale,"South");
                    ovale.addActionListener(this);
            }
            public void actionPerformed (ActionEvent ev)
            {
                    if(ev.getSource() == rectangle) pan.setRectangle();
                    if(ev.getSource() == ovale) pan.setOvale();
                    pan.repaint();
            }
            private Panneau pan;
            private JButton rectangle,ovale;
    }
    /////////////////////////////////
    class Panneau extends JPanel
    {
            public void paintComponent(Graphics g)
            {
                    super.paintComponent(g);
                    if(ovale)
                    {
                            g.drawOval(80,20,120,60);
                    }
                    if(rectangle)
                    {
                            g.drawRect(80,20,120,60);
                    }
            }
            public void setRectangle()
            {
                    ovale = false; rectangle = true;
            }
            public void setOvale()
            {
                    ovale = true; rectangle = false;
            }
            private boolean rectangle = false;
            private boolean ovale = false;
    }
    /////////////////////////////////
    public class Fenetre
    {
            public static void main(String[] args)
            {
                    JFrame Fen = new MaFenetre();
                    Fen.setVisible(true);
            }
    }       

    mais il y a une erreur quand je clique sur l'un des boutons !
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at MaFenetre.actionPerformed(Fenetre.java:29)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:18
    49)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
    a:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
    .java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
    )
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
    istener.java:234)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212
    )
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)

    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
    read.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

    Merci encore !
    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2006 à 17:06:01

      salut
      je pens eque le probleme vient du fait que tu met le actionlistener apres l'avoir ajouter a ton container. un fois ajouter, il est impossible de modifier les objets et don de leur coller un listener.
      tu dois donc faire :
      ovale.addActionListener(this);
      contenu.add(ovale,"south");


      je viens de voir que tu declare ton panneau et tes bouttons a la fin de ta classe. il faut le faire des le debut.
      voila
      ++
      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2006 à 18:11:36

        Citation : Pas de titre

        un fois ajouter, il est impossible de modifier les objets et don de leur coller un listener.



        et on ferais comment alors pour changer le fond du backround quand on clique sur un bouton par exemple..

        le prob viens du faite que t'a pas très bine compris le principe d'interface et que ca merde bien dans ton code, y a moyen de faire comme tu fait mais ca fait longtemps qu'on utilise plus de code de se type pour les listenner alors je te propose ceci

        une classe privée interne qui implément ActionListener

        import javax.swing.*;
        import java.awt.event.*;
        import java.awt.*;
        ////////////////////////////////
        class MaFenetre extends JFrame {
                       
                       
                public MaFenetre() {
                        setTitle("Fenetre");
                        setBounds(50,50,300,200);
                        Container contenu = getContentPane();
                        // panneau
                        pan = new Panneau(); //ici y avait une faute qui faisait tout foiré tu comprend pq?
                        pan.setBackground(Color.yellow);
                        getContentPane().add(pan);
                        /////rajout
                                        listener lin = new listener();
                                        // rectangle
                        rectangle = new JButton("Rectangle"); //ici encore la meme fautes
                        contenu.add(rectangle,"North");
                        rectangle.addActionListener(lin);
                        // ovale
                        ovale = new JButton("Ovale"); //ici aussi
                        contenu.add(ovale,"South");
                        ovale.addActionListener(lin);
                                        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // c'est mieux pour que le programme s'arrete vraiment
                }
               
                        private class listener implements ActionListener {
                                public void actionPerformed (ActionEvent ev) {
                        if(ev.getSource() == rectangle) pan.setRectangle();
                        if(ev.getSource() == ovale) pan.setOvale();
                        pan.repaint();
                                }
                        }
                       
                private Panneau pan;
                private JButton rectangle,ovale;
        }
        /////////////////////////////////
        class Panneau extends JPanel
        {
                public void paintComponent(Graphics g)
                {
                        super.paintComponent(g);
                        if(ovale)
                        {
                                g.drawOval(80,20,120,60);
                        }
                        if(rectangle)
                        {
                                g.drawRect(80,20,120,60);
                        }
                }
                public void setRectangle()
                {
                        ovale = false;
                                        rectangle = true;
                }
                public void setOvale()
                {
                        ovale = true;
                                        rectangle = false;
                }
                private boolean rectangle = false;
                private boolean ovale = false;
        }
        /////////////////////////////////
        public class Fenetre
        {
                public static void main(String[] args)
                {
                        MaFenetre  Fen = new MaFenetre(); // je ne vois pas l'interet de mettre le type JFrame
                        Fen.setVisible(true);
                }
        }       




        après avoir regardé ton code de près j'ai trouvé les erreurs qui faisait que ca compilait mais que ton programme était totalement faut
        si tu ne voit pas pourquoi envoie moi un message


        import javax.swing.*;
        import java.awt.event.*;
        import java.awt.*;
        ////////////////////////////////
        class MaFenetre extends JFrame implements ActionListener  {
                       
                       
                public MaFenetre() {
                        setTitle("Fenetre");
                        setBounds(50,50,300,200);
                        Container contenu = getContentPane();
                        // panneau
                        pan = new Panneau(); //ici y avait une faute qui faisait tout foiré tu comprend pq?
                        pan.setBackground(Color.yellow);
                        getContentPane().add(pan);
                        // rectangle
                        rectangle = new JButton("Rectangle"); //ici encore la meme fautes
                        contenu.add(rectangle,"North");
                        rectangle.addActionListener(this);
                        // ovale
                        ovale = new JButton("Ovale"); //ici aussi
                        contenu.add(ovale,"South");
                        ovale.addActionListener(this);
                                        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // c'est mieux pour que le programme s'arrete vraiment
                }
                public void actionPerformed (ActionEvent ev)
                {
                        if(ev.getSource() == rectangle) pan.setRectangle();
                        if(ev.getSource() == ovale) pan.setOvale();
                        pan.repaint();
                }
                private Panneau pan;
                private JButton rectangle,ovale;
        }
        /////////////////////////////////
        class Panneau extends JPanel
        {
                public void paintComponent(Graphics g)
                {
                        super.paintComponent(g);
                        if(ovale)
                        {
                                g.drawOval(80,20,120,60);
                        }
                        if(rectangle)
                        {
                                g.drawRect(80,20,120,60);
                        }
                }
                public void setRectangle()
                {
                        ovale = false;
                                        rectangle = true;
                }
                public void setOvale()
                {
                        ovale = true;
                                        rectangle = false;
                }
                private boolean rectangle = false;
                private boolean ovale = false;
        }
        /////////////////////////////////
        public class Fenetre
        {
                public static void main(String[] args)
                {
                        MaFenetre  Fen = new MaFenetre(); // je ne vois pas l'interet de mettre le type JFrame
                        Fen.setVisible(true);
                }
        }       


        le premier code est plus propre et il existe encore une autre manière mais elle n'était pas idéal dans ton cas enfin disons qu'il aurait fallut penser le programme autrement


        edit je peut pas laisser passer cette horreur

        Citation : Pas de titre

        je viens de voir que tu declare ton panneau et tes bouttons a la fin de ta classe. il faut le faire des le debut. >



        encore une fois rien avoir c'est juste deux convention différente mais pour le compilateur c'est la meme chose
        des fois on se demande si vous savez ce que vous écrivez
        • Partager sur Facebook
        • Partager sur Twitter

        [JAVA] les événements

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown