IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Redimensionner une JFrame avec valeur limite


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Redimensionner une JFrame avec valeur limite
    Bon j'avais posé ma question dans un autre post mais je préfère reposé la question dans un nouveau post.

    Donc puisque il n'est pas possible de limité la taille d'une JFrame, j'ai créer ma propre méthode.
    Je n'ai en fait permis le redimensionnement qu'à partir du coin inférieur droit. J'ai donc fait setResizeable(false) et rajouté un MouseMotionListener qui me permet de detecté lorsque la souris est dans le coin et si je fais un drag à partir de là, je fais un apel a setSize().

    La méthode fonctionne bien. Elle redimensionne bien et rapidement la fenêtre. Seul hic, il y a un effet de scintillement (clipping?) sur l'ensemble des composants de la fenetre(image, JButon, JTextArea...).
    Je ne sais pas comment l'enlever.

    Le probleme vient du fait qu'il redessine les composants à chaque apel de setSize(). Si je ne rajoute pas
    ComponentAdapter cl =
    new ComponentAdapter (){

    public void componentHidden(ComponentEvent e){}
    public void componentMoved(ComponentEvent e){}
    public void componentResized(ComponentEvent e){}
    public void componentShown(ComponentEvent e){}

    };
    addComponentListener(cl);
    dans ma JFrame, il ne redessine jamais les composants.

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 201
    Points : 173
    Points
    173
    Par défaut
    salut.
    Si j'ai bien compris ton problemme c'est que lors ce que tu redimensionne ta frame les composant ne se redessine pas.
    Comment a tu dimensionné tes composant (JButton,JLabel...)?.
    Il vaut mieux les redimensionnés avec la methode setBounds(x,y,x_longueur,y_largeur)
    c'est beaucoup mieux je crois, comme ca tes composant ne changeron pas de position meme si tu redimensionne ta frame.
    J'espere que je tes aidé

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Avec le componentListener, il redessine automatiquement les composants. Par contre si je ne défini pas le component listener, il ne redessine pas les composants.

    Je n'ai pas donné de taille a mes composants, j'utilise un BorderLayout pour les positionner. Donc si je ne défini pas le ComponentListener, je ne sais pas comment les redessiner automatiquement à la bonne taille.

    Sinon avec le componentListener, il les redessine automatiquement lorsque je maintien la souris et étire la fenetre. Ca crée un clignotement plutot désagréable...
    Comment eviter ce scintillement des composants lorsqu'ils sont redessiné ?

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Toutes les méthodes de ton ComponentAdapter sont vides ???
    Je ne vois pas pourquoi dans ce cas il y a une différence de comportement avec ou sans ComponentAdapter...
    Pour le problème de scintillement, je pense que cela vient du fait que la fenêtre est redessinée entièrement à chaque mouvement de la souris, comme le temps de repaint n'est pas négligeable, l'oeil perçoit deux images successives dans un intervalle de temps trop long (en deça de 24 images par seconde, une image animée n'est pas fluide).
    Si tu as la possibilité d'agir sur le repaint (en l'état je n'ai pas bien compris qui le déclenchait...) je te suggère de ne repeindre la fenêtre que si la différence entre deux redimensionnements consécutifs est supérieure à une certaine valeur (par exemple, ne repeindre que si deltaX ou deltaY est > 5 pixels).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Moi non plus je ne vois pas pourquoi il y a un changement avec ou sans le componentListener vu qu'il est vide.

    Mais le probleme, c'est que sans le component listener, je n'arrive pas du tout a redessiner les composants. J'ai essayé de faire appel a repaint et update mais rien ne change :s

    J'avais eu l'idée de redessiner uniquement lorsque la différence de taille était suffisante mais vu que je ne fais pas appel moi meme à repaint, j'avais hésité a le faire.

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Redimensionner une JFrame avec valeur limite
    Salut,

    pour donner un redimentionement maxi il existe la methode setMaximizedBounds(Rectangle rec) de la classe Frame et naturellement disponible avec les JFrame
    mais le hic c'est quelle ne concerne pas la taille mini de la fenetre donc a voir ....


    sinon pour ton problème de scintillement tu pourrais redefinir la methode update de ta frame exemple :

    private Image offScreenImage = null;
    ....
    public void update(Graphics g) {
    if (offScreenImage == null)
    offScreenImage = createImage(getWidth(), getHeight());
    Graphics offGr = offScreenImage.getGraphics();
    paint(offGr);
    g.drawImage(offScreenImage, 0, 0, this);
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Si je rajoute ce que tu m'a dis twins, les composants ne sont jamais redessinés... Je n'arrive pas a comprendre ce qui fait appel au méthode paint de tous mes composant. Normalement update() ou repaint() devrait s'en occuper mais apperement ce n'est pas le cas.


    Sinon existe t'il une methode qui peut mettre en pause un thread autre que suspend() qui est déprécié. Et qu'elle est la méthode pr relancé le thread ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Salut,


    sinon tu as la methode paintChildren ou les methodes xxxUI

    mais pour une aide plus efficace pourrais tu donner le code de ton paintComponent defois que cela vienne de la ...

  9. #9
    Membre habitué Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Points : 148
    Points
    148
    Par défaut
    ON PEUT LIMITER LA TAILLE D'UNE FENETRE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JFrame f = new JFrame();
    f.setMaximumSize(new Dimension(800, 600));
    f.setMinimumSize(new Dimension(300, 200));
    C'est une usine à gaz ton affaire :

    Tu dis que la fenêtre n'est pas redimensionnable (avec setResizable(false)) mais que si l'utilisateur met la souris dans le coin inférieur droit alors tu redimensionnes la fenêtre avec setSize ???

    Autant laissé setResizable à true...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Je n'ai pas redéfini le paint de ma JFrame.

    Voici son code complet

    edit : afin de faciliter la programmation, j'ai défini toutes les variables static dans une classe V

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
       import javax.swing.*;
       import java.awt.*;
       import java.awt.event.*;
     
     
     
        public class FenetrePrincipale extends JFrame {//implements ComponentListener{
     
     
          static ComponentListener cl;
     
     
           public static void main (String [] args) throws Exception {
     
             V.FP = new FenetrePrincipale();
     
          }
     
     
           public FenetrePrincipale() throws Exception { // methode créant le cadre principal et appelant la méthode Panneau pour completer la fenetre
     
     
     
     
             setTitle (" Fenetre Principale ");
             V.c = getContentPane();
             V.pp = new PanneauPrincipal();
             V.c.add (V.pp);
     
     
             setJMenuBar(new MenuPrincipal());
     
     
             setSize ((int)V.fpDim.getWidth() ,(int)V.fpDim.getHeight());
             setVisible ( true );
             //setResizable(false);
     
     
             setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
             addWindowListener (
                    new WindowAdapter (){
                       public void windowClosing (WindowEvent e){
                         //System . exit (0);
                         try {new FenetreFermeture();}
                             catch (Exception ex1)
                            {System.exit(1);}
                      }
                   });
     
             ComponentAdapter cl = 
                    new ComponentAdapter (){
     
                       public void componentHidden(ComponentEvent e){}
                       public void componentMoved(ComponentEvent e){}
                       public void componentResized(ComponentEvent e){}
                       public void componentShown(ComponentEvent e){}
     
                   };
             addComponentListener(cl);
     
     
          }
     
       }
    Le componentAdapter n'est là que parce qu'il me permet de redessiner mes composants à la bonne taille.

    Ma méthode de redimensionnement a été défini dans le panneauInfo.
    Voici son code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
       import java.awt.event.*;
       import javax.swing.*;
       import java.awt.*;
     
        public class PanneauInfo extends JPanel {
     
          Point m,m2;
          int mx1,mx2,my1,my2;
          int dx, dy;
          int ms=0,mm=0;
          int i=0;
     
           public void paint (final Graphics g){
             MouseListener ml = 
                    new MouseListener() {
     
                       public void mouseClicked(MouseEvent e){}
                       public void mouseEntered(MouseEvent e){}
                       public void mouseExited(MouseEvent e){}
                       public void mousePressed(MouseEvent e) {}
                       public void mouseReleased(MouseEvent e) {
                         if (ms == 1) {
                            ms = 0;
                            (V.fpDim).setSize((V.FP).getWidth(), (V.FP).getHeight());
                         }	
                      }
                   };
             this.addMouseListener(ml);
     
             MouseMotionListener mml = 
                    new MouseMotionListener() {
                       public void mouseMoved(MouseEvent e) {
                         if ( (e.getX() >= getWidth()-20) && (e.getX() < getWidth()) )
                            if ( (e.getY() >= getHeight()-20) && (e.getY() < getHeight()) ) {
     
                               mm = 1;
     
                               (V.fpDimp) = V.FP.getSize();
                               m = MouseInfo.getPointerInfo().getLocation();
                               mx1 = (int)m.getX();  	
                               my1 = (int)m.getY();	
                               setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
     
                            }
                            else {setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));}
                         else {setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));}
     
                      }
     
                       public void mouseDragged(MouseEvent e) {
                         if (mm == 1) {
     
                            ms = 1;
     
                            m2 = MouseInfo.getPointerInfo().getLocation();
                            mx2 = (int)m2.getX();  	
                            my2 = (int)m2.getY();
     
                            dx = mx2-mx1;
                            dy = my2-my1;
     
                            (V.FP).setSize( (int)((V.fpDimp).getWidth()+dx), (int)((V.fpDimp).getHeight()+dy));
                         }             
     
                      }
     
                   };
             this.addMouseMotionListener(mml);
     
          }
     
       }
    Je ne pense pas que c'est très utile de vous le montré mais bon sait on jamais...

    Je n'ai pas encore mis en place la limite de taille, il ne s'agit que du code permettant le redimensionnement.
    Dans le code présent, je ne fait pas appel à la méthode repaint() de ma fenetre principale (V.FP) car le componentAdapter s'en charge.





    Pour répondre a White Rabbit :

    J'ai besoin d'avoir une taille minimum pour ma fenêtre afin de gérer la disposition des composants et évité des comportements du programme qui ne serait pas trés esthétique.

    Si tu essais par toi même tu te rendras compte que setMaximumSize et setMinimumSize ne fonctionne que pour des composants contenu et non pas contenant (racine de l'architechture) donc JFrame, JWindows ne le prennent pas en compte.

  11. #11
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Sinon existe t'il une methode qui peut mettre en pause un thread autre que suspend() qui est déprécié. Et qu'elle est la méthode pr relancé le thread ?
    Il n'existe pas de methode mais une astuce (attente active) :
    Il suffit de voir la page du site de Sun ou c'est expliqué (pourquoi les méthodes suspend, resume et stop sont dépréciées ?)

    ++
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Up !



    Sinon j'ai une nouvelle question :

    Qu'elle est la différence entre un BufferedImage et un Image ?

Discussions similaires

  1. Redimensionner une matrice avec "reshape"
    Par kmaniche dans le forum Images
    Réponses: 9
    Dernier message: 07/06/2006, 18h35
  2. [debutant] dimensionnement d'une JFrame avec utilisation d'un pack()
    Par scarpat dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 02/06/2006, 09h45
  3. Trier une table avec valeur de differentes unités
    Par Sydaze dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2005, 11h43
  4. Interdire de redimensionner une JFrame
    Par java_math dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/06/2004, 13h59
  5. Faire une JFrame avec LookAndFeel
    Par aburner dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/12/2003, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo