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

2D Java Discussion :

JScrollpane et z-order


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Par défaut JScrollpane et z-order
    Bonjour à vous,

    j'ai une petite appli qui contient un JScrollpane. Au lancement de l'application, celui-ci est initialisé avec le constructeur vide (new JScrollpane() ).
    Via un événement sur un JButton, je place dans ce scrollpane un objet Grille héritant de Canvas et implémentant Scrollable.
    Le Scrollpane se "remplit" bien avec mon objet mais le problème est que mon objet Grille est plus grand que le Scrollpane (d'où l'interet du scroll ), mais le dessin de ma grille passe au dessus du reste des éléments de ma fenetre (le scroll et le JPanel contenant tout). C'est un peu gênant...

    Voici comment sont déclarés le scrollpane et l'ajout de la grille :

    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
     
    private JScrollPane getJScrollPane() {
            if (this.jScrollPane == null) {
                this.jScrollPane = new JScrollPane();
                this.jScrollPane.setDoubleBuffered(true);
                this.jScrollPane.setMaximumSize(new Dimension(1000,715));
                this.jScrollPane.setBounds(new Rectangle(5, 5, 1000, 715));
            }
            return this.jScrollPane;
        }
     
    private Canvas getGrille(int f, int w, int h) {
            if(this.grille == null) {
                this.grille = new Grille(f,w,h);
            }
            return this.grille;
        }
     
    //evenement JButton
    this.jScrollPane.setViewportView(getGrille(f, w, h));
    Le code de Grille :
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    package org.gui;
     
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.util.HashMap;
    import java.util.Vector;
     
    import javax.swing.JViewport;
    import javax.swing.Scrollable;
    import javax.swing.SwingConstants;
     
    import org.objects.Maille;
     
    public class Grille extends Canvas implements Scrollable {
     
        /**
         * 
         */
        private static final long serialVersionUID = -3969910545852295647L;
        private HashMap<String,Maille> elements;
        private Vector<Maille> elem;
     
     
        public Grille(int finesse,int w,int h) {
            super();
     
            this.elem = new Vector<Maille>();
            this.elements = new HashMap<String,Maille>();
     
            for(int i=5;i<=w;i+=finesse)
            {
                for(int j=5;j<=h;j+=finesse) {
                    Maille m = new Maille(i+"_"+j,i,j,5,5);
                    this.elements.put(i+"_"+j,m);
                    this.elem.add(m);
                }
            }
            this.setSize(w, h);
     
        }
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(new Color(166,194,222));
     
            for(Maille m : this.elem)
            {
                g2.draw(m);
            }
        }
     
        public Dimension getPreferredScrollableViewportSize() {
            return getPreferredSize();
        }
     
        public int getScrollableUnitIncrement(Rectangle visibleRect,
            int orientation, int direction) {
            return 10;
        }
     
        public int getScrollableBlockIncrement(Rectangle visibleRect,
            int orientation, int direction) {
            return (orientation == SwingConstants.VERTICAL) 
                        ? visibleRect.height
                        : visibleRect.width;
        }
     
        public boolean getScrollableTracksViewportWidth() {
            if (getParent() instanceof JViewport) {
                return (((JViewport) getParent()).getWidth() > getPreferredSize().width);
            }
            return false;
        }
     
        public boolean getScrollableTracksViewportHeight() {
            if (getParent() instanceof JViewport) {
                return (((JViewport) getParent()).getHeight() > getPreferredSize().height);
            }
            return false;
        }
     
     
     
    }
    Sachant que l'objet Maille (dans Grille) est juste un objet perso qui herite de Rectangle.Double et rajoute juste un nom et un boolean.

    Une idée svp ?

    Merci par avance

    Archange

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tes es en train de mélanger des composants Swing (lightWeight) et AWT(heavyweight), ce qui est les source de ton problème, voir la FAQ pour en comprendre la raison.
    Remplace donc ton Canvas par un JComponent (la seul modif à faire est de remplacer le extends Canvas par un extends JComponent et de remplacer paint par paintComponent, çà ira tout de suite mieux.
    De plus le JScrollPane se base sur la preferredSize du composant qu'il contient pour déterminer s'il doit permettre le scrolling ou pas, donc penses bien à setter la preferredSize de ta classe Grille sinon tu n'auras pas de scroll

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Par défaut
    Merci à toi sinok

    Cela fonctionne au poil dorénavant...

    Thanks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 12h17
  2. Probleme avec un "order by"
    Par LineLe dans le forum ASP
    Réponses: 30
    Dernier message: 16/09/2003, 15h38
  3. ORDER BY
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/07/2003, 11h56
  4. [JScrollPane] élargir la taille
    Par nyny_p dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 03/05/2003, 10h54
  5. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 13h29

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