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

JavaFX Discussion :

Elements qui dépassent, mais pas de scrollbar


Sujet :

JavaFX

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 29
    Par défaut Elements qui dépassent, mais pas de scrollbar
    Bonjour,

    Je suis en train de developper une petite application de gestion, mais je suis bloqué à un petit problème, je développe en JavaFX avec netbeans. Problème sur la compréhension des layout principalement, et aussi de l'ajout d'une barre de defilement en cas de dépassement des element enfant dans le layout parent. Voici ma hiérarchie :

    Class main étend Application
    Application contient une scene
    scene qui contient root
    root étend Group
    root contient mon menubarre et mon vueMain
    vueMain étend AnchorPane
    vueMain contient deux HBox
    Mes deux HBox contiennent deux VBox
    Mes quatre vBox contiennent des elements label et tableview

    Petite question, j'ai une largeur et hauteur défini sur la largeur et la hauteur du stage, mais celui ci n'est pas bindé si mon stage change de taille, c'est grave?
    Par ailleurs, le constructeur de root a pour argument Stage fenetrePrincipale, ReadOnlyDoubleProperty width, ReadOnlyDoubleProperty height, je ne comprend pas bien pourquoi utiliser des readonlydoubleproperty, et non pas simplement un double?

    Comment je gère le dépassement des elements hbox contenu dans vueMain? Avec un scrollPane?

    Si je dois utiliser le scrollPane, n'est il pas mieux de directement étendre root en scrollPane? Ou devrais-je étendre vueMain en scrollPane? Ou bien mettre les éléments de vueMain dans un scrollPane? Et pourquoi?

    Comment centrer un layout par rapport a la taille de son parent? J'ai crée une fonction pour ca, mais n'y a t-il rien du tout de deja fait?

    Merci à vous

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Ps : un petit dessus de l’aperçu de ce à quoi ça ressemble ou même une vue de la hiérarchie des nœuds (via ScenicView par exemple) ça aide aussi.

    Citation Envoyé par Rhadopsy Voir le message
    Par ailleurs, le constructeur de root a pour argument Stage fenetrePrincipale, ReadOnlyDoubleProperty width, ReadOnlyDoubleProperty height, je ne comprend pas bien pourquoi utiliser des readonlydoubleproperty, et non pas simplement un double?
    Ben ça dépend de qui a programmé ça. Bon par contre Group n'est pas vraiment redimensionnable (sa taille dépende son contenu) donc le fait de passer des propriétés c'est sans doute pour binder les tailles sur le contenu qui lui s'adaptera alors aux nouvelles dimensions de la scène. Passer de simples valeurs de double n'aurait pas permi de changer la taille du contenu lorsque la taille de la fenêtre/scène change.

    Ben à toi de voir où tu veux mettre ton ScrollPane ce n'est pas forcément bien de le mettre tout au sommet du graphe (tu as une barre de menu apparemment).

    Pour le centrage dans le layout ben tu as StackPane qui fait ça. Après il faut configurer le contenu pour éviter qu'il se redimensionne si tu n'en a pas envie. Les autres layouts ont aussi souvent des hints pour les alignements verticaux et horizontaux de même que les extensions verticales et horizontales donc il est possible de centrer les choses dedans aussi.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 29
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ps : un petit dessus de l’aperçu de ce à quoi ça ressemble ou même une vue de la hiérarchie des nœuds (via ScenicView par exemple) ça aide aussi.

    Ben ça dépend de qui a programmé ça. Bon par contre Group n'est pas vraiment redimensionnable (sa taille dépende son contenu) donc le fait de passer des propriétés c'est sans doute pour binder les tailles sur le contenu qui lui s'adaptera alors aux nouvelles dimensions de la scène. Passer de simples valeurs de double n'aurait pas permi de changer la taille du contenu lorsque la taille de la fenêtre/scène change.

    Ben à toi de voir où tu veux mettre ton ScrollPane ce n'est pas forcément bien de le mettre tout au sommet du graphe (tu as une barre de menu apparemment).

    Pour le centrage dans le layout ben tu as StackPane qui fait ça. Après il faut configurer le contenu pour éviter qu'il se redimensionne si tu n'en a pas envie. Les autres layouts ont aussi souvent des hints pour les alignements verticaux et horizontaux de même que les extensions verticales et horizontales donc il est possible de centrer les choses dedans aussi.
    Scenic view a l'air cool, mais pour l'instant il ne fait que de chercher mes projets javafx.

    Pour le scrollPane, j'ai beau vouloir l'utiliser il n'y a jamais de barre de défilement qui apparait lors du dépassement des éléments enfants lors d'un redimensionnement, je pense qu'il faut détecter quand il y a un dépassement (donc au redimensionnement par rapport à la taille de la scène et de la taille des éléments de la scène...) Mais j'aurai aimé qu'il y ai une fonction pour capter ça, peut être y en a t-il une ? J'ai pas envie de ré inventer la roue, de plus après quelques test, ca fonctionne bien si j'ajoute directement un scrollpane a ma scene, mais ca marche pas si j'ajoute un group ou meme un anchorpane, dès que je met le scollpane dans un layout parent ca marche plus.

    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
     
     
    //Class test 
     
    public class JavaFXtest extends Application {
     
        @Override
        public void start(Stage primaryStage) {
     
            int WIDTH = 800;
            int HEIGHT = 600;
     
            Button btn = new Button();
            Button btn2 = new Button();
            Label lbl = new Label();
            Label lbl2 = new Label();
            GridPane gpane = new GridPane();
            ScrollPane scrollpane = new ScrollPane();
            Group group = new Group();
            AnchorPane anchorpane = new AnchorPane();
     
            //assignement
            lbl.setText("Il dit bonjour le monsieur. Alors ta mere saperlipopete");
            lbl.setUnderline(true);
     
            lbl2.setText("Il dit bonjour le monsieur.");
            lbl2.setUnderline(true);
     
            btn.setText("Say 'Hello World'");
            btn.setOnAction(new EventHandler<ActionEvent>() {
     
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                }
            });
     
            btn2.setText("Say 'Hello World'");
            btn2.setOnAction(new EventHandler<ActionEvent>() {
     
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                }
            });
     
            VBox vbox1 = new VBox();
     
            vbox1.getChildren().addAll(lbl, btn);
     
            VBox vbox2 = new VBox();
     
            vbox2.getChildren().addAll(lbl2, btn2);
     
            GridPane.setConstraints(vbox1, 0, 0);
            GridPane.setConstraints(vbox2, 1, 0);
     
            gpane.getChildren().setAll(vbox1, vbox2);
            //gpane.getColumnConstraints().addAll(new ColumnConstraints(150, 250, 500), new ColumnConstraints(100, 130, 200));
            gpane.setGridLinesVisible(true);
     
            scrollpane.setContent(gpane);
     
            anchorpane.getChildren().add(scrollpane);
     
            Scene scene = new Scene(anchorpane, WIDTH, HEIGHT);
            scene.setFill(Color.LIGHTBLUE);
            scene.getStylesheets().add("test.css");      
     
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
     
     
    }
    Pour le centrage du layout, j'ai crée une fonction toute simple dans une class ChangeListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void centrerLayout(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
              setValeurWidthFenetrePrincipale(newValue);
              setCentreWidthFenetre(getValeurWidthFenetrePrincipale().doubleValue() / 2); 
              this.vueAnchorPane.setLayoutX(getCentreWidthFenetre() - (this.vueAnchorPane.getWidth() / 2));
     
        }
    Je remarque avec scenic view que mon root n'est pas redimensionnable? A cause du faite que ce soit un groupe? Ca pose problème? Scenic view :

    Nom : Capture.PNG
Affichages : 261
Taille : 58,5 Ko

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 29
    Par défaut
    Ok bon, j'ai reussi, en faite j'ai en parent AnchorPane et en enfant ScrollPane et mon GridPane a la taille du ScrollPane, j'ai définie une position fixe par rapport a l'AnchorPane c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    scrpaneAfficherClient.setContent(gpaneAfficherClient);
            AnchorPane.setBottomAnchor(scrpaneAfficherClient, 100.0);
            AnchorPane.setTopAnchor(scrpaneAfficherClient, 100.0);
            AnchorPane.setLeftAnchor(scrpaneAfficherClient, 150.0);
            AnchorPane.setRightAnchor(scrpaneAfficherClient, 150.0);
     
            this.getChildren().add(scrpaneAfficherClient);
    Et ca fonctionne, je pensais pas qu'il fallait définir une position bas haut gauche droite par rapport au parent

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 29
    Par défaut
    J'ai encore un petit problème ^^

    Mon gridPane ne veut pas appliquer la méthode de ScrollPane : setFitToWidth(true) et setFitToHeight(true)
    Il garde sa taille initiale, et du coup c'est pas terrible, si vous savez...

    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
    //Constructeur
        public Vue_Main(Root refRoot) {
            this.refRoot = refRoot;
     
            this.prefWidthProperty().bind(this.refRoot.getWidth());
            this.prefHeightProperty().bind(this.refRoot.getHeight());
     
            scrpaneVueMain.setFitToWidth(true);
            scrpaneVueMain.setFitToHeight(true);
     
            //On applique une classe de style pour les titres
            lblTicketUrgent.getStyleClass().add("titreTableau");
            lblInfoClient.getStyleClass().add("titreTableau");
            lblRelanceImpaye.getStyleClass().add("titreTableau");
            lblStock.getStyleClass().add("titreTableau");
     
            GridPane.setConstraints(lblTicketUrgent, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(tblTicketUrgent, 0, 1, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(lblStock, 1, 0, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(tblStock, 1, 1, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(lblInfoClient, 0, 2, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(tblInfoClient, 0, 3, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(lblRelanceImpaye, 1, 2, 1, 1, HPos.CENTER, VPos.CENTER);
            GridPane.setConstraints(tblRelanceImpaye, 1, 3, 1, 1, HPos.CENTER, VPos.CENTER);
     
            gpaneVueMain.getChildren().addAll(lblTicketUrgent, tblTicketUrgent, 
                                              lblStock, tblStock,
                                              lblInfoClient, tblInfoClient,
                                              lblRelanceImpaye, tblRelanceImpaye);
     
            gpaneVueMain.setHgap(10);
            gpaneVueMain.setVgap(10);
     
            gpaneVueMain.setGridLinesVisible(true);
     
            AnchorPane.setBottomAnchor(scrpaneVueMain, 100.0);
            AnchorPane.setTopAnchor(scrpaneVueMain, 100.0);
            AnchorPane.setLeftAnchor(scrpaneVueMain, 150.0);
            AnchorPane.setRightAnchor(scrpaneVueMain, 150.0);
     
            scrpaneVueMain.setContent(gpaneVueMain);
     
            this.getChildren().add(scrpaneVueMain);
        }

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 29
    Par défaut
    Ok j'ai résolu le problème, en faite il fallait gérer les contraintes des colonnes de GridPane... Fiouuu.

    Du coup ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GridPane.setConstraints(lblTicketUrgent, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(tblTicketUrgent, 0, 1, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(lblStock, 1, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(tblStock, 1, 1, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(lblInfoClient, 0, 2, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(tblInfoClient, 0, 3, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(lblRelanceImpaye, 1, 2, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);
    GridPane.setConstraints(tblRelanceImpaye, 1, 3, 1, 1, HPos.CENTER, VPos.CENTER, Priority.SOMETIMES, Priority.SOMETIMES);

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Bon pas eut le temps de tester ou répondre, bravo d'avoir trouvé tout seul et d'avoir reporté ici tes trouvailles !
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/07/2006, 10h04
  2. Trigger qui rollback, mais pas complètement
    Par Monstros Velu dans le forum Développement
    Réponses: 3
    Dernier message: 20/04/2006, 10h18
  3. Code qui marche, mais pas la mise à jour
    Par Cablan dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 17h09
  4. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 12h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

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