[SWING][JFRAME] Problème de raffraichissement lors du redimenssionnement
cs_Tiaps
Messages postés5Date d'inscriptionmercredi 17 septembre 2003StatutMembreDernière intervention18 juin 2004
-
10 juin 2004 à 10:15
cs_Tiaps
Messages postés5Date d'inscriptionmercredi 17 septembre 2003StatutMembreDernière intervention18 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);
}
}