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

 Java Discussion :

Inclure Jscroll dans Jframe


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut Inclure Jscroll dans Jframe
    Bonjour!

    J'ai une petite question, qui me prend la tête! surtout que ca doit être relativement simple!
    J'ai regarder sur d'autre discution sur le forum, et je ne vois pas de probléme semblable, donc voilà : lorsque j'affiche mon JscrollPane dans une Jframe que je crée dans la même classe que ce Jscroll, pas de souci.
    Mais lorsque je veux l'inclure dans une autre Jframe, ca n'affiche rien...
    est-ce que quelqu'un peut m'expliquer pourquoi?
    Je met le code des mes deux classes.

    De ma Jframe principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     private void initComponents() {
     
    	...
     else if (evt.getButton()==1){
        this.getContentPane().add(new AffichageArbre(mod));
     }...
    }
    De mon JscrollPane :
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Rectangle2D;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
     
    import org.jgraph.JGraph;
    import org.jgraph.graph.AttributeMap;
    import org.jgraph.graph.DefaultCellViewFactory;
    import org.jgraph.graph.DefaultEdge;
    import org.jgraph.graph.DefaultGraphCell;
    import org.jgraph.graph.DefaultGraphModel;
    import org.jgraph.graph.DefaultPort;
    import org.jgraph.graph.GraphConstants;
    import org.jgraph.graph.GraphModel;
    import org.jgraph.graph.VertexView;
     
     
    public class AffichageArbre extends JScrollPane{
    JScrollPane scroll;
        public AffichageArbre(ModeleArbre mod){
     
    // Construct Model and Graph
    GraphModel model = mod;
    final JGraph graph = new JGraph(model);
     
    graph.setEditable(false);
    graph.setMoveable(false);
    // Enable edit without final RETURN keystroke
    graph.setInvokesStopCellEditing(true);
    graph.getGraphLayoutCache().setFactory(new JComponentCellViewFactory());
    // When over a cell, jump to its default port (we only have one, anyway)
    graph.setJumpToDefaultPort(true);
     
    //MouseListener
    graph.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
          if (e.getClickCount() == 2) {
            // Get Cell under Mousepointer
            int x = e.getX(), y = e.getY();
            ModelePers cell = (ModelePers) graph.getFirstCellForLocation(x, y);
            System.out.println("cell : " + cell + "fini");
            new NewPerson(cell);
                    }
        }
    });
    // Insert all three cells in one call, so we need an array to store them
    DefaultGraphCell[] cells = new DefaultGraphCell[3];
     
    // Create Salut Vertex
    cells[0] = createVertex(20,40);
     
    // Create World Vertex
    cells[1] = createVertex(120, 160);
     
    // Create Edge
    DefaultEdge edge = new DefaultEdge();
    // Fetch the ports from the new vertices, and connect them with the edge
    edge.setSource(cells[0].getChildAt(0));
    edge.setTarget(cells[1].getChildAt(0));
    cells[2] = edge;
     
    // Set Arrow Style for edge
    int arrow = GraphConstants.ARROW_CLASSIC;
    GraphConstants.setLineEnd(edge.getAttributes(), arrow);
    GraphConstants.setEndFill(edge.getAttributes(), true);
     
    // Insert the cells via the cache, so they get selected
    graph.getGraphLayoutCache().insert(cells);
     
    // Show in Frame
    this.add(graph);
    //frame.getContentPane().add(scroll);
    //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //frame.pack();
    //frame.setVisible(true);
    }
     
    public static DefaultGraphCell createVertex(int x, int y) {
        double W = 200;
        double H = 70;
        // Create vertex with the given name
     
       ModelePers cell = new ModelePers(new Person(new AttributPerson(false, "Vincent",
               "Rollin",new GregorianCalendar(789, Calendar.MAY, 5),"Dechy",
               new GregorianCalendar(1992, Calendar.MAY, 5),null,null,null,null),null));
     
        // Set bounds
        GraphConstants.setBounds(cell.getAttributes(), new Rectangle2D.Double(
        x, y, W, H));
     
        //set VertexView
        VertexView vertex = new MyVertexView(cell);
     
        // Set fill color
        GraphConstants.setGradientColor(cell.getAttributes(), Color.GREEN);
        GraphConstants.setOpaque(cell.getAttributes(), true);
     
     
        // Set raised border
        GraphConstants.setBorder(cell.getAttributes(), BorderFactory
                .createRaisedBevelBorder());
     
     
        // Add a Port
        DefaultPort port = new DefaultPort();
        cell.add(port);
        port.setParent(cell);
     
        return cell;
       }
     
     
    private class JComponentCellViewFactory extends DefaultCellViewFactory
    {
    protected VertexView createVertexView(Object objCell)
    {
    DefaultGraphCell cell = (DefaultGraphCell) objCell;
    VertexView vertex = null;
    vertex = new MyVertexView((ModelePers) cell);
     
    return vertex;
    }
    }
    }

    Voilà, vous savez ce qui cloche? :/

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    quand tu change le contenu d'un conteneur visible, il faut appeler validate() dessus après pour refaire les calculs.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void initComponents() {
    	
    	...
     else if (evt.getButton()==1){
        this.getContentPane().add(new AffichageArbre(mod));
        this.getContentPane().validate();
     }...
    }
    Ca ne marche pas non plus :/

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut
    En gros, si dans la classe du graph je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Show in Frame
    JFrame frame = new JFrame();
    frame.getContentPane().add(new JScrollPane(graph));
    //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
    Ca marche, à condition que dans la fenetre principale (où je veux afficher mon graph en définitive!) je ne mette pas ca :
    Dans ce cas, ca m'affichera une petite Jframe sans rien dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     else if (evt.getButton()==1){
         AffichageArbre aff = new AffichageArbre(mod);
      this.getContentPane().add(new JScrollPane(new aff.getGraph()));
      this.getContentPane().validate();
     }
    Si je commente le code de la classe du graph, rien ne se passe...

    Quelqu'un à une idée?

    Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut
    Bon, beh c'est résolu!
    "Juste" une histoire de Layout généré par netbeans! En mettant un FlowLayout() ca marche nikel!

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Pour aller plus loin, il s'agit effectivement d'un pb de layout.
    Tu utilises finalement le FlowLayout mais tu pourrai utiliser un BorderLayout, GridBagLayout, ...
    Ce qu'il te manque encore est la définition des tailles (minimum, préférée, maximum) de tes composants afin de ton LayoutManager puisse déterminer comment afficher au mieux tes composants. Surtout lors de l'invocation de pack() et lors d'un redimensionnement.

    Bonne continuation

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut
    D'accord!
    Merci bien pour les infos

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 35
    Par défaut
    Etant donnée que le probléme a été évoqué juste au dessus, j'en profite pour en parler!

    mon graph ne s'affiche pas en entier, il manque des partis sur le coté, pourtant, je l'ai mis dans un JscrollPane?
    Pour info, j'utilise le FlowLayout.
    Une petite idée?
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JScrollPane scroll = new JScrollPane(new AffichageArbre(this.mod).getGraph());
            scroll.setMaximumSize(this.getSize());
            this.getContentPane().add(scroll);
    	this.getContentPane().validate();
    edit : Il fallait simplement paramétrer le "setPreferredSize()" sur une taille plus petite que ce que je met à l'interieur.

  9. #9
    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
    Ton problème ici est la combinaison d'un FlowLayout et d'un JScrollPane.
    Le FlowLayout dispose les composants sur une même ligne tant qu'il a de la place à disposition. Or le JScrollPane fournit une place horizontale illimitée par définition. D'où les parties manquantes.

    Quelle disposition cherches tu à obtenir dans le JPanel que tu mets dans ton JScrollPane?

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

Discussions similaires

  1. status bar dans JFrame
    Par hysah dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 01/06/2006, 19h29
  2. Inclure vi dans un script shell
    Par PierrotY dans le forum Linux
    Réponses: 3
    Dernier message: 18/05/2006, 09h28
  3. JPanel dans JFrame non visible au lancement.
    Par PRomu@ld dans le forum Agents de placement/Fenêtres
    Réponses: 16
    Dernier message: 17/03/2006, 08h22
  4. inclure installation dans installeur
    Par pitch21 dans le forum Installation
    Réponses: 3
    Dernier message: 24/02/2006, 09h16
  5. [VB.NET] Inclure MSDE dans le package
    Par SergeF dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 24/06/2004, 21h18

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