[SWING][JFRAME] Problème de raffraichissement lors du redimenssionnement

cs_Tiaps Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 juin 2004 - 10 juin 2004 à 10:15
cs_Tiaps Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 juin 2004 - 11 juin 2004 à 10:20
Bonjour,
J'ai une fenêtre sur laquelle j'ai fait un setUndecorated(true).
Sur son rootPane, j'ai rajouté un border.
J'ai créé une classe qui simule le redimenssionnement d'une fenêtre en se basant sur le border du contentPane(quand on clique sur le bord et qu'on bouge la souris, la fenêtre se redimenssione).
Mon problème est que le contenu de la fenêtre clignote lorsque je la redimmensionne.
Je pense que cavient du fait que pour redimenssionner je doit modifier la taille de la fenêtre, sa position, la taille du contentPane et la taille du rootPane. Tout ceci entraine 5 appels au repaint de la frame. Je pense que ca vient de la.
Apparemment c'est l'appel à la modification de la taille de la fenêtre qui crée le problème. Toutes les modifs sur la taille et la position sont faîtes à la fin du mouseDragged
Voici mon source si vous êtes disposé à m'aider :

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.RootPaneContainer; 

public class WindowBorderMouseListener extends MouseInputAdapter { 

        private static final boolean debug = false; 

        private static final String NORTH= "N"; 
        private static final String NORTH_EAST = "NE"; 
        private static final String EAST = "E"; 
        private static final String SOUTH_EAST= "SE"; 
        private static final String SOUTH = "S"; 
        private static final String SOUTH_WEST = "SW"; 
        private static final String WEST = "W"; 
        private static final String NORTH_WEST = "NW"; 
// RootPaneContainer est l'interface commune à JDialog, JFrame et JWindow 
// component est le composant sur lequel on travaille 
        private RootPaneContainer component = null; 
// indique si l'on est sur un bord 
        private boolean borderSelected = false; 
// indique la position de la souris avant le mouvement permet de savoir dans quel sens  ce déplace la souris 
        private Point oldPosition =null; 
// indique sur quelle partie du bord on se trouve : Nord, nord est ,etc.. 
        private String selectedBorder =null; 
// dimension minimum que peux prendre la fenêtre 
        private Dimension minimumSize = null; 
        public WindowBorderMouseListener(RootPaneContainer component){ 
                this.component = component; 
        } 
        public WindowBorderMouseListener(RootPaneContainer component,Dimension minimumSize){ 
                this.component = component; 
                this.minimumSize = minimumSize; 
        } 

        public void mousePressed(MouseEvent me){ 
                Point clickPoint = me.getPoint(); 
                if(isInBorder(clickPoint) /*&& ((me.getButton() & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK)*/){ 
                        borderSelected = true; 
                        oldPosition = clickPoint; 
                        selectedBorder = getClickPosition(me); 
//      System.out.println("BorderMouseListener.java.mousePressed() => "+selectedBorder); 
                }else{ 
                        borderSelected=false; 
                        oldPosition = null; 
                        selectedBorder=null; 
                } 
        } 

        public void mouseMoved(MouseEvent me){ 
                if(debug){ 
         System.out.println("WindowBorderMouseListener.java.mouseMoved() => isInBorder ? "+isInBorder(me.getPoint())); 
 } 
                if(isInBorder(me.getPoint())){ 
                        setCursor(getClickPosition(me)); 
                }else{ 
                        setCursor(null); 

} 
} 

        /** 
         * setCursor 
         * 
         * @param selectedBorder String 
         */ 
        private void setCursor (String selectedBorder){ 
                if(selectedBorder == null){ 
                        ((Component)component).setCursor(Cursor.getDefaultCursor()); 
} 
                else if(selectedBorder.equals(NORTH)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(NORTH_EAST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(EAST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(SOUTH_EAST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(SOUTH)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(SOUTH_WEST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(WEST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); 
                } else if(selectedBorder.equals(NORTH_WEST)){ 
                        ((Component)component).setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); 
                } 
        } 

        public void mouseReleased(MouseEvent me){ 
                borderSelected=false; 
                oldPosition = null; 
                selectedBorder=null; 
        } 

        public void mouseDragged(MouseEvent me){ 
                if(borderSelected){ 
                        Point diff=getMove(me); 

                        Point location = ((Component)component).getLocation(); 
                        Dimension size = ((Component)component).getSize(); 
                        Point oldPositionTranslation = null; 
                        if(selectedBorder.equals(NORTH)){ 
                                //location 
                                location.translate(0,diff.y); 
                                //size 
                                size.setSize(size.width,size.height-diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(0,0); 
                        } else if(selectedBorder.equals(NORTH_EAST)){ 
                                //location 
                                location.translate(0,diff.y); 
                                //size 
                                size.setSize(size.width+diff.x,size.height-diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(diff.x,0); 
                        } else if(selectedBorder.equals(EAST)){ 
                                //location 
                                location.translate(0,0); 
                                //size 
                                size.setSize(size.width+diff.x,size.height); 
                                //old point 
                                oldPositionTranslation = new Point(diff.x,0); 
                        } else if(selectedBorder.equals(SOUTH_EAST)){ 
                                //location 
                                location.translate(0,0); 
                                //size 
                                size.setSize(size.width+diff.x,size.height+diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(diff.x,diff.y); 
                        } else if(selectedBorder.equals(SOUTH)){ 
                                //location 
                                location.translate(0,0); 
                                //size 
                                size.setSize(size.width,size.height+diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(0,diff.y); 
                        } else if(selectedBorder.equals(SOUTH_WEST)){ 
                                //location 
                                location.translate(diff.x,0); 
                                //size 
                                size.setSize(size.width-diff.x,size.height+diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(0,diff.y); 
                        } else if(selectedBorder.equals(WEST)){ 
                                //location 
                                location.translate(diff.x,0); 
                                //size 
                                size.setSize(size.width-diff.x,size.height); 
                                //old point 
                                oldPositionTranslation = new Point(0,0); 
                        } else if(selectedBorder.equals(NORTH_WEST)){ 
                                //location 
                                location.translate(diff.x,diff.y); 
                                //size 
                                size.setSize(size.width-diff.x,size.height-diff.y); 
                                //old point 
                                oldPositionTranslation = new Point(0,0); 
                        } 
                        if(size.width<minimumSize.width ){ 
                         size.width = minimumSize.width; 
                         location.x=((Component)component).getLocation().x; 
                         oldPositionTranslation.x = 0; 

                        }if( size.height < minimumSize.height){ 
                          size.height = minimumSize.height; 
                          location.y=((Component)component).getLocation().y; 
                          oldPositionTranslation.y = 0; 

                        } 
                        ((Component)component).setSize(size); 
                          ((Component)component).setLocation(location); 
                          component.getRootPane().setSize(size); 
                          component.getContentPane().setSize(size); 
                          oldPosition.translate(oldPositionTranslation.x,oldPositionTranslation.y); 
                  //         ((Component)component).repaint(); 
                        

                } 
        } 
        private String getClickPosition(MouseEvent me){ 
                String res = null; 
                JComponent component = this.component.getRootPane(); 
                Insets insets =  component.getBorder().getBorderInsets(component); 
                if(me.getX()<insets.left){ 
                        if(me.getY()<insets.top){ 
                                res = NORTH_WEST; 
                        }else if (me.getY()<((JComponent)component).getHeight()-insets.bottom){ 
                                res=WEST; 
                        }else{ 
                                res = SOUTH_WEST; 
                        } 
                }else if (me.getX()<((JComponent)component).getWidth()-insets.right){ 
                        if(me.getY()<insets.top){ 
                                res = NORTH; 
                        }else if (me.getY()<((JComponent)component).getHeight()-insets.bottom){ 

                        }else{ 
                                res = SOUTH; 
                        } 
                }else{ 
                        if(me.getY()<insets.top){ 
                                res = NORTH_EAST; 
                        }else if (me.getY()<((JComponent)component).getHeight()-insets.bottom){ 
                                res = EAST; 
                        }else{ 
                                res = SOUTH_EAST; 
                        } 
                } 
                return res; 
        } 
        /** 
         * getMove 
         * 
         * @param me MouseEvent 
         * @return Point 
         */ 
        private Point getMove(MouseEvent me){ 
                Point diff = new Point(me.getX()-oldPosition.x,me.getY()-oldPosition.y); 
                return diff; 
        } 
        private boolean isInBorder(Point point){ 
                boolean res = false; 
                res = !getInBounds().contains(point); 
                return res; 
        } 

        public Rectangle getInBounds(){ 
                JComponent component = this.component.getRootPane(); 
                Rectangle bounds = ((JComponent)component).getBounds(); 
                bounds.setLocation(0,0); 
 Insets insets =  ((JComponent)component).getBorder().getBorderInsets(((JComponent)component)); 
 bounds.translate(insets.left,insets.top); 
 bounds.setSize(bounds.width-insets.right-insets.left,bounds.height-insets.top-insets.bottom); 
 return bounds; 

        } 

        public static void main(String[] args) { 
                JFrame frame = new JFrame(); 
                frame.setUndecorated(true); 
    frame.getRootPane().setBorder(BorderFactory.createLineBorder(Color.BLACK,10)); 

                JPanel panel = new JPanel(){ 
                        public void paintComponent(Graphics g){ 
                                super.paintComponent(g); 
                        } 
                }; 
                panel.setBorder(BorderFactory.createLineBorder(Color.BLACK,10)); 
                panel.setBounds(100,100,100,100); 
                Dimension minimumSize = new Dimension(50,50); 
                WindowBorderMouseListener bml = new WindowBorderMouseListener(frame,minimumSize); 
                frame.addMouseListener(bml); 
                frame.addMouseMotionListener(bml); 
                frame.getContentPane().setLayout(null); 
                frame.getContentPane().add(panel); 

                frame.setSize(400,400); 
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
                frame.setVisible(true); 
        } 

} 

4 réponses

cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004
11 juin 2004 à 09:18
tu as essayé setDoubleBuffered(true) sur ta fenetre principale?

B@ron {EU.BELGIUM}
0
cs_Tiaps Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 juin 2004
11 juin 2004 à 09:28
Cette méthode n'existe pas dans JFrame
0
cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004
11 juin 2004 à 09:34
Sorry c'est dans JPanel, tu peux toujours transférer l'ensemble de tes composants graphiques dans un gros jpanel...

B@ron {EU.BELGIUM}
0
cs_Tiaps Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 18 juin 2004
11 juin 2004 à 10:20
Malheureusement non, c'est la JFrame que je veux redimenssioner. J'ai déjà fait le redimenssionnement des composant d'un container et ca marche nickel
0