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

AWT/Swing Java Discussion :

[AWT] setMaximumSize inneficient, comment y pallier?


Sujet :

AWT/Swing Java

  1. #1
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    avril 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : avril 2008
    Messages : 164
    Points : 205
    Points
    205
    Par défaut [AWT] setMaximumSize inneficient, comment y pallier?
    Bonsoir,

    Si on fait (testé en java 6, java 8, avec Windows 7, 10 et GNOME 2.28.2) un truc tout basique :
    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
    import java.awt.Dimension;
    import java.awt.Frame;
     
    public class Launch extends Frame {
     
        public Launch() {
            setMinimumSize(new Dimension(100, 100));
            setMaximumSize(new Dimension(800, 600));
            setSize(400, 400);
            setVisible(true);
     
        }
     
        public static void main(String[] args) {
            new Launch();
        }
    }
    Le minimumSize marche très bien mais je maximumSize est sans effet.
    C’est connu, voire http://bugs.sun.com/bugdatabase/view...bug_id=6464548, mais pour ce que je comprends le non fonctionnement de setMaximumSize n’est pas systématique, il y a des cas où ça marche.

    Par ailleurs, quand on essaye de mettre des points d’arrêt, on voit que l’on ne passe pas dans les fonctions setBounds/reshape de component au moment du resize (mais on y passe au démarrage 2 fois, à l’appel du setMinimuSize et à l’appel du setSize, je vous passe les arbres d’appel).
    Si on rajoute un élément à la fenêtre, mettons un label, et qu’on retaille la fenêtre elle change de dimension puis on s’arrête dans reshape pour le label, mais pas pour la fenêtre.

    Si je mets un point d’arrêt dans BorderLayout.layoutContainer, j’y passe (via component.dispatchEventImpl) mais :
    • Après que ma fenêtre ait-été effectivement redimensionnée
    • Sans rien y faire


    Donc, 2 questions :
    1. Qui gère pour de vrai mon redimensionnement, traite mes évènements ? (Visiblement pas trop component<|-- Container <|--Windows<|--Frame)
    2. Comment faire, autrement, pour imposer une taille max (question a priori étroitement liée à la première) ?


    Bonne soirée,

    Gaillac

  2. #2
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    avril 2008
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : avril 2008
    Messages : 164
    Points : 205
    Points
    205
    Par défaut
    Bonsoir,

    je n'ai pas vraiment répondu à la question, mais néanmoins j'ai un contournement.
    Inacceptable dans mon cas d'aller toucher à X11 et AWT, mais je partage quand même.

    Côté AWT, la classe Window redéfini un setMinimumSize qui fait un appel à ((WindowPeer)peer).updateMinimumSize(), ce n’est pas le cas pour setMaximumSize qui conserve son comportement de base défini dans la classe grand-mère component, sans appel au peer.

    Côté X11, l’équivalent du updateMinimumSize de WindowPeer est setMaximizedBounds. Malheureusement il n’est défini que XFramePeer dont inaccessible au JDialog. De plus le service setVisible de XDecoratedPeer a été patché (pour la correction d’un bug 4320050) pour supprimer le flag PMaxSize des NormalHints XlibWrapper, ce qui rendrait inefficient un setMaximizedBounds qu’on ne fait pas.

    Donc avec des modifications à trois niveaux:
    • Côté x11
      en remontant setMaximizedBounds depuis XFramePeer vers XWindowPeer,
      en supprimant le XWM.removeSizeHints(this, XUtilConstants.PMaxSize); du setVisible de XDecoratedPeer ;
    • Côté AWT en créant dans Window.java un setMaximumSize symétrique au setMinimumSize qui appelle le nouveau WindowPeer.setMaximizedBounds (et bien sûr en mettant à jour l’interface WindowPeer) ;
    • Côté client en appelant ce setMaximumSize lors de la configuration du JDialog en question.

Discussions similaires

  1. [Débutante] Interface AWT ou Swing ? Comment faire ?
    Par motivée dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 28/04/2008, 11h03
  2. Comment dessiner dans une Awt.Component?
    Par mehdiing dans le forum Graphisme
    Réponses: 6
    Dernier message: 16/05/2007, 17h09
  3. Réponses: 5
    Dernier message: 08/01/2007, 19h40
  4. [AWT][ScrollPane] comment accéler le scroll ?
    Par Crash_TeTe dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/07/2006, 14h13
  5. comment pallier aux long int en php ?
    Par ouam81 dans le forum Langage
    Réponses: 2
    Dernier message: 06/06/2006, 09h25

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