Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comportement etrange de JPanel

Sujet résolu
    10 octobre 2011 à 16:50:03

    Bonjour!

    Rien de bien complique, me semble-t-il, mais je n'arrive neanmoins pas a resoudre le probleme.

    J'ai une sous-classe de JPanel qui n'est construite qu'une seule fois.
    Pourtant, a l'affichage, elle apparait deux fois (dont une fois en chargant une image passee en parametre).

    Le resultat, ici:
    Image utilisateur


    J'ai juste 2 classes:
    Labelz.java
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /*
     * Labelz.java
     *
     * Created on 06-Oct-2011, 15:15:14
     */
    package labelz;
    
    import java.awt.Graphics;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    //import java.util.logging.Level;
    //import java.util.logging.Logger;
    
    /**
     *
     * @author s1157846
     */
    public class Labelz extends javax.swing.JFrame {
    
        private String myImg;
        private LabelzPanel myLabelzPanel;
        /** Creates new form Labelz */
        public Labelz() {
            initComponents();
        }
        
        /** Creates new form Labelz */
        public Labelz(String image) {
            this.myImg = image;
            initComponents();
            try {
                this.myLabelzPanel = new LabelzPanel(image);
                System.out.println(this.myLabelzPanel.getSize());
                jPanel3.add(this.myLabelzPanel);
                //this.repaint();
            } catch (Exception ex) {
                Logger.getLogger(Labelz.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
            jPanel1 = new javax.swing.JPanel();
            jPanel2 = new javax.swing.JPanel();
            jButton1 = new javax.swing.JButton();
            jPanel3 = new javax.swing.JPanel();
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            jMenuItem4 = new javax.swing.JMenuItem();
            jMenuItem1 = new javax.swing.JMenuItem();
            jSeparator2 = new javax.swing.JPopupMenu.Separator();
            jMenuItem2 = new javax.swing.JMenuItem();
            jMenuItem3 = new javax.swing.JMenuItem();
            jSeparator1 = new javax.swing.JPopupMenu.Separator();
            jMenuItem10 = new javax.swing.JMenuItem();
            jSeparator3 = new javax.swing.JPopupMenu.Separator();
            jMenuItem5 = new javax.swing.JMenuItem();
            jMenuItem6 = new javax.swing.JMenuItem();
            jMenu2 = new javax.swing.JMenu();
            jMenuItem7 = new javax.swing.JMenuItem();
            jMenuItem8 = new javax.swing.JMenuItem();
            jSeparator4 = new javax.swing.JPopupMenu.Separator();
            jMenuItem9 = new javax.swing.JMenuItem();
            jSeparator5 = new javax.swing.JPopupMenu.Separator();
            jMenuItem11 = new javax.swing.JMenuItem();
            jMenu3 = new javax.swing.JMenu();
            jMenuItem12 = new javax.swing.JMenuItem();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setResizable(false);
    
            jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
    
            jButton1.setText("jButton1");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
            jPanel2.setLayout(jPanel2Layout);
            jPanel2Layout.setHorizontalGroup(
                jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel2Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jButton1)
                    .addContainerGap(564, Short.MAX_VALUE))
            );
            jPanel2Layout.setVerticalGroup(
                jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel2Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jButton1)
                    .addContainerGap(51, Short.MAX_VALUE))
            );
    
            jPanel3.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
            jPanel3.setPreferredSize(new java.awt.Dimension(640, 480));
            jPanel3.setLayout(new java.awt.GridLayout(1, 1));
    
            javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 644, Short.MAX_VALUE)
                        .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addContainerGap(144, Short.MAX_VALUE))
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
            );
    
            jMenu1.setText("File");
    
            jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem4.setText("New Project...");
            jMenu1.add(jMenuItem4);
    
            jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem1.setText("Open Project...");
            jMenu1.add(jMenuItem1);
            jMenu1.add(jSeparator2);
    
            jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem2.setText("Save Project");
            jMenu1.add(jMenuItem2);
    
            jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem3.setText("Save Project As...");
            jMenu1.add(jMenuItem3);
            jMenu1.add(jSeparator1);
    
            jMenuItem10.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem10.setText("Export Project As Image...");
            jMenu1.add(jMenuItem10);
            jMenu1.add(jSeparator3);
    
            jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem5.setText("Close Project");
            jMenu1.add(jMenuItem5);
    
            jMenuItem6.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem6.setText("Exit");
            jMenu1.add(jMenuItem6);
    
            jMenuBar1.add(jMenu1);
    
            jMenu2.setText("Edit");
    
            jMenuItem7.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem7.setText("Undo");
            jMenu2.add(jMenuItem7);
    
            jMenuItem8.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Y, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem8.setText("Redo");
            jMenu2.add(jMenuItem8);
            jMenu2.add(jSeparator4);
    
            jMenuItem9.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.CTRL_MASK));
            jMenuItem9.setText("Change Background Image...");
            jMenu2.add(jMenuItem9);
            jMenu2.add(jSeparator5);
    
            jMenuItem11.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_DELETE, 0));
            jMenuItem11.setText("Delete a Shape...");
            jMenu2.add(jMenuItem11);
    
            jMenuBar1.add(jMenu2);
    
            jMenu3.setText("Help");
    
            jMenuItem12.setText("About");
            jMenu3.add(jMenuItem12);
    
            jMenuBar1.add(jMenu3);
    
            setJMenuBar(jMenuBar1);
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            );
    
            pack();
        }// </editor-fold>
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            addNewPolygon();
        }                                        
    
        /**
         * @param args the command line arguments
         */
        public static void main(final String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    Labelz window = new Labelz(args[0]);
                    window.setVisible(true);
                }
            });
        }
        
        /**
        * handles New Object button action
        */
        public void addNewPolygon() {
            this.myLabelzPanel.addNewPolygon();
        }
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            this.myLabelzPanel.paint(g); //update image panel
        }
        // Variables declaration - do not modify
        private javax.swing.JButton jButton1;
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenu jMenu2;
        private javax.swing.JMenu jMenu3;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JMenuItem jMenuItem1;
        private javax.swing.JMenuItem jMenuItem10;
        private javax.swing.JMenuItem jMenuItem11;
        private javax.swing.JMenuItem jMenuItem12;
        private javax.swing.JMenuItem jMenuItem2;
        private javax.swing.JMenuItem jMenuItem3;
        private javax.swing.JMenuItem jMenuItem4;
        private javax.swing.JMenuItem jMenuItem5;
        private javax.swing.JMenuItem jMenuItem6;
        private javax.swing.JMenuItem jMenuItem7;
        private javax.swing.JMenuItem jMenuItem8;
        private javax.swing.JMenuItem jMenuItem9;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JPanel jPanel2;
        private javax.swing.JPanel jPanel3;
        private javax.swing.JPopupMenu.Separator jSeparator1;
        private javax.swing.JPopupMenu.Separator jSeparator2;
        private javax.swing.JPopupMenu.Separator jSeparator3;
        private javax.swing.JPopupMenu.Separator jSeparator4;
        private javax.swing.JPopupMenu.Separator jSeparator5;
        // End of variables declaration
    }
    


    et LabelzPanel.java
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /*
     * LabelzPanel.java
     *
     * Created on 06-Oct-2011, 15:17:36
     */
    package labelz;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.ArrayList;
    import javax.imageio.ImageIO;
    
    /**
     *
     * @author s1157846
     */
    public class LabelzPanel extends javax.swing.JPanel implements MouseListener {
    
        /**
         * image to be tagged
         */
        BufferedImage image = null;
    
        /**
         * list of current polygon's vertices 
         */
        ArrayList<Point> currentPolygon = null;
    
        /**
         * list of polygons
         */
        ArrayList<ArrayList<Point>> polygonsList = null;
    
        /** Creates new form LabelzPanel */
        public LabelzPanel() {
            System.out.println("NEW LABELZPANEL");
            initComponents();
            currentPolygon = new ArrayList<Point>();
            polygonsList = new ArrayList<ArrayList<Point>>();
    
       //     this.setVisible(true);
    //*
            Dimension panelSize = new Dimension(640, 480);
            this.setSize(panelSize);
            this.setMinimumSize(panelSize);
            this.setPreferredSize(panelSize);
            this.setMaximumSize(panelSize);
    //*/
            addMouseListener(this);
        }
        
        /**
         * extended constructor - loads image to be labelled
         * @param imageName - path to image
         * @throws Exception if error loading the image
         */
        public LabelzPanel(String imageName) throws Exception{
            this();
            image = ImageIO.read(new File(imageName));
            System.out.println(image.getWidth()+image.getHeight());
            if (image.getWidth() > 640 || image.getHeight() > 480) {
                int newWidth = image.getWidth() > 640 ? 640 : (image.getWidth() * 480)/image.getHeight();
                int newHeight = image.getHeight() > 480 ? 480 : (image.getHeight() * 640)/image.getWidth();
                System.out.println("SCALING TO " + newWidth + "x" + newHeight );
                Image scaledImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_FAST);
                image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
                image.getGraphics().drawImage(scaledImage, 0, 0, this);
            }
        }
        
        /**
         * Displays the image
         */
        public void ShowImage() {
            Graphics g = this.getGraphics();
    
            if (image != null) {
                g.drawImage(
                    image, 0, 0, null);
            }
        }
        
        @Override
        public void paint(Graphics g) {
            super.paint(g);
    
            //display iamge
            ShowImage();
    
            //display all the completed polygons
            for(ArrayList<Point> polygon : polygonsList) {
                drawPolygon(polygon);
                finishPolygon(polygon);
            }
    
            //display current polygon
            drawPolygon(currentPolygon);
        }
        
        /**
        * displays a polygon without last stroke
        * @param polygon to be displayed
        */
        public void drawPolygon(ArrayList<Point> polygon) {
            Graphics2D g = (Graphics2D)this.getGraphics();
            g.setColor(Color.GREEN);
            for(int i = 0; i < polygon.size(); i++) {
                Point currentVertex = polygon.get(i);
                if (i != 0) {
                    Point prevVertex = polygon.get(i - 1);
                    g.drawLine((int)prevVertex.getX(), (int)prevVertex.getY(), (int)currentVertex.getX(), (int)currentVertex.getY());
                }
                g.fillOval((int)currentVertex.getX() - 5, (int)currentVertex.getY() - 5, 10, 10);
            }
        }
        
        /**
        * displays last stroke of the polygon (arch between the last and first vertices)
        * @param polygon to be finished
        */
        public void finishPolygon(ArrayList<Point> polygon) {
            //if there are less than 3 vertices than nothing to be completed
            if (polygon.size() >= 3) {
                Point firstVertex = polygon.get(0);
                Point lastVertex = polygon.get(polygon.size() - 1);
    
                Graphics2D g = (Graphics2D)this.getGraphics();
                g.setColor(Color.GREEN);
                g.drawLine((int)firstVertex.getX(), (int)firstVertex.getY(), (int)lastVertex.getX(), (int)lastVertex.getY());
            }
        }
        
        /**
        * moves current polygon to the list of polygons and makes pace for a new one
        */
        public void addNewPolygon() {
            //finish the current polygon if any
            if (currentPolygon != null ) {
                finishPolygon(currentPolygon);
                polygonsList.add(currentPolygon);
            }
    
            currentPolygon = new ArrayList<Point>();
        }
    
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 640, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 480, Short.MAX_VALUE)
            );
        }// </editor-fold>
        // Variables declaration - do not modify
        // End of variables declaration
    
        @Override
        public void mouseClicked(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
    
            //check if the cursos withing image area
            if (x > image.getWidth() || y > image.getHeight()) {
                //if not do nothing
                return;
            }
    
            Graphics2D g = (Graphics2D)this.getGraphics();
    
            //if the left button than we will add a vertex to poly
            if (e.getButton() == MouseEvent.BUTTON1) {
                g.setColor(Color.GREEN);
                if (currentPolygon.size() != 0) {
                    Point lastVertex = currentPolygon.get(currentPolygon.size() - 1);
                    g.drawLine((int)lastVertex.getX(), (int)lastVertex.getY(), x, y);
                }
                g.fillOval(x-5,y-5,10,10);
    
                currentPolygon.add(new Point(x,y));
                System.out.println(x + " " + y);
            } 
        }
    
        @Override
        public void mousePressed(MouseEvent me) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    
        @Override
        public void mouseReleased(MouseEvent me) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    
        @Override
        public void mouseEntered(MouseEvent me) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    
        @Override
        public void mouseExited(MouseEvent me) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    }
    


    Pas mal de code a ete genere avec Netbeans, mais ca devrait donner une idee du code.

    Il faut juste appeler le main avec un argument : l'emplacement d'une image.

    En esperant que d'autres zer0s trouveront ce que je n'ai pas pu trouver.

    Merci !!!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      10 octobre 2011 à 23:10:55

      Salut,

      Attention, c'est la méthode paintComponent qu'il faut surcharger pour personnaliser le dessin d'un composant, et non paint. Paint est elle-même chargée d'appeler (entre autres) paintComponent.

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        11 octobre 2011 à 0:25:29

        Bien vu!

        Ca a l'air de resoudre a moitie mon probleme, c'est deja beaucoup!
        Maintenant, c'est tout propre mais ca n'affiche pas l'image tant que je sors pas l'image de l'ecran (faut que je bouge la fenetre de mon programme, quoi :p).

        J'ai essaye pas mal de trucs apres avoir remplace les deux paint (un par classe) par paintComponent. J'ai meme tente de mettre un repaint dans un thread (on rigole pas :o ).

        Avec un System.out.println("toto"); dans paintComponent j'ai pu constater que paintComponent n'etait appele que quand la fenetre sortait de l'ecran, et pas quand j'appelais repaint(). Il est bien appele une fois a l'initialisation, mais ca a pas l'air d'aider.

        En esperant que tu sauras aider avec autant de precision qu'a la premiere fois, ou quelqu'un d'autre :)

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          11 octobre 2011 à 13:24:16

          Passe l'objet Graphics que te fournit le système dans le paintComponent à ta méthode ShowImage et dessine directement dedans, plutôt que de demander un nouveau contexte graphique.

          Ensuite, généralement, on appelle pas soi-même les méthodes de dessin mais simplement repaint() donc évite de faire toi-même un showImage() en dehors du paintComponent() (ou d'une méthode appelée par elle). Surtout que tu le fais dans ton constructeur, là où en général le composant n'est pas encore visible.
          • Partager sur Facebook
          • Partager sur Twitter

          Comportement etrange de JPanel

          × 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