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 :

Redimensionner un conteneur (layout-pane)


Sujet :

JavaFX

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut Redimensionner un conteneur (layout-pane)
    Bonjour,

    Lorsque je crée un composant, exemple : un TableView, je suis face à deux problèmes :
    1. Lorsque je 'place' mon composant dans mon layout (ex. : dans un BorderPane), celui-ci (composant) ne prend pas tout l'espace. C'est-à-dire que je suis obligé de donner une taille au composant. Ce que je souhaite c'est que mon TableView prenne la taille disponible dans mon SplitPane (réellement dans mon StackPane)
    2. Mon composant (TableView) ne se redimensionne pas lorsque je redimensionne ma fenêtre principale. Mon TableView garde sa taille.

    Y a-t-il une règle en JavaFX pour résoudre ces problèmes ?

    Merci d'avance pour votre attention.

    Marc

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ça dépendra à la fois du contrôle utilisé et de son conteneur. Il faut donc jouer avec les tailles min / pref / max pour voir ce qui fonctionne sachant que chaque type de parent semble avoir ses propres règles pour le redimensionnent de son contenu (et que ces dernières sont peu claires pour le développeur j'en suis témoin). Perso je mets des bordures via CSS (-fx-border-color par exemple) pour voir quand un contrôle change de taille ou pas.

    Est-ce qu'on peut voir un peu de code de ce que tu essaie de faire pour tester ?
    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 du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Bonjour et merci pour ton aide,
    Dans le code ci-dessous, je rencontre 2 problèmes de redimensionnement. D’abord, le TabPane (je n’ai pas créé de bordure comme tu le proposais et donc je suppose que c’est le TabPane !), ne prend pas toute la dimension de la fenêtre principale (root) en sachant que cette dernière prend tout l’écran du PC (stage.setMaximized(true)).

    Deuxièmement, le TableView ne prend pas la largeur (ni la longueur d’ailleurs) du stackPane_2 dont la dimension est déterminée par splitPane.setDividerPositions(0.12, 0.3);

    Dans les 2 cas, si je joue avec ‘tailles min / pref / max’ ça n’affiche pas ce que je souhaite puisque mes conteneurs enfants (TabPane et TableView) prennent la taille que je détermine par min/pref et max, dans mon cas cache mes autres élements !

    Et dans les 2 cas, si je modifie la taille de ma fenêtre principale lorsque celle-ci est à l’écran (ex. : avec ma souris), les conteneurs ‘enfants’ ne se redimensinnent pas.

    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
    private Stage stage;
    private Scene scene;
    private BorderPane root = new BorderPane();
    private TabPane tabPane = new TabPane();
    private Tab tabDashboard tabDashboard = new Tab();
     
    tabDashboard.setContent(groupDashboard);	// ‘groupDashboard’ est une autre classe Java
    tabPane.getTabs().addl(tabDashboard);
     
    root.setCenter(tabPane);
    scene = new Scene(root, Color.DARKSLATEGRAY);
    stage.setScene(scene);
    stage.setMaximized(true);
    stage.show();
     
    // classe ‘groupDashboard’ **********************************
    private SplitPane splitPane = new SplitPane();
    private StackPane stackPane_1 = new StackPane();
    private StackPane stackPane_2 = new StackPane();
    private StackPane stackPane_3 = new StackPane();
    private BorderPane borderPane_stackPane_2 = new BorderPane();
     
    borderPane_stackPane_2.setTop(vbox_toolBar); //Je n'ai pas mis le code du 'vbox_toolBar' car c'est simplement un VBox qui contient un ToolBar
    borderPane_stackPane_2.setBottom(tableViewPanel); //‘tableViewPanel’ est un TableView que je crée dans un autre classe Java
    stackPane_2.getChildren().add(borderPane_stackPane_2);
    splitPane.getItems().addAll(stackPane_1, stackPane_2, stackPane_3);
    splitPane.setDividerPositions(0.12, 0.3);

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    La version de test :

    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
    public class Main extends Application {
     
        private SplitPane splitPane = new SplitPane();
        private StackPane stackPane_1 = new StackPane();
        private StackPane stackPane_2 = new StackPane();
        private StackPane stackPane_3 = new StackPane();
        private BorderPane borderPane_stackPane_2 = new BorderPane();
     
        private Stage stage;
        private Scene scene;
        private BorderPane root = new BorderPane();
        private TabPane tabPane = new TabPane();
        private Tab tabDashboard = new Tab();
     
        @Override
        public void start(Stage primaryStage) {
            borderPane_stackPane_2.setTop(new VBox());
            borderPane_stackPane_2.setBottom(new TableView());
            stackPane_2.getChildren().add(borderPane_stackPane_2);
            splitPane.getItems().addAll(stackPane_1, stackPane_2, stackPane_3);
            //splitPane.setDividerPositions(0.12, 0.3);
            Platform.runLater(() -> splitPane.setDividerPositions(0.12, 0.3));
            tabDashboard.setContent(splitPane);
            tabPane.getTabs().addAll(tabDashboard);
            root.setCenter(tabPane);
            scene = new Scene(root, Color.DARKSLATEGRAY);
            stage = primaryStage;
            stage.setScene(scene);
            stage.setMaximized(true);
            stage.show();
        }
     
        public static void main(String[] args) {
            launch(args);
        }
    }
    Alors, avec le JDK 1.8.0_102 :
    1. Le TabPane prend bien toute la taille de la scène.
    2. Le TableView prend bien toute la largeur de son parent.
    3. Le seul changement que j'ai fait pour le moment c'est l'introduction d'un Platform.runLater() pour spécifier les positions de split ; le SplitPane est en effet mal foutu : les valeurs saisies par l’utilisateur sont ignorée tant que le contrôle n'est pas visible a l’écran.


    Apres bien sur vu qu'on sait pas ce qu'est groupDashboard difficile de savoir si le soucis vient de la. Si c'est un Group comme son nom le suggère, ben c'est facile, un Group n'est pas redimensionnable.
    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

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Merci,

    Je vois ça à la maison ce soir .
    Mais moi j'utilise la version JDK 1.8.0_60, je vais devoir me mettre à jour !
    Et en effet, groupDashboard est un Group. La raison de ce choix est le simple fait de séparer mon code pour ne pas avoir tout dans la même classe. Ne connaissant pas JavaFX, c'est le moyen que j'avais trouvé et qui 'fonctionnait'.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Hélas, ça ne fonctionne tjrs pas mais je mets ça sur le compte du Group.
    Je mets le code du Group ci-dessous...
    Comment puis-je travailler pour remplacer mes Group car je travaille partout comme ça .
    Comme je le disais plus haut, je travaille comme ça pour séparer mon code et éviter ainsi de mettre tout le code dans la même classe (comme le veulent les bonnes pratiques du développeur) ?

    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
     
    public class GroupMaterials extends Region implements Observer{
        private SplitPane splitPane;
        private StackPane stackPane_1;
        private StackPane stackPane_2;
        private StackPane stackPane_3;
        private BorderPane borderPane_stackPane_2;
        private TableViewPanel tableViewPanel;   // De nouveau un Group
        private ToolBar toolBar;
        private VBox vbox_toolBar; 
        private Button button_AddMaterial;
     
        private MainView mainView;
     
        public GroupMaterials(MainView mainView){
            this.mainView = mainView;
     
            // Layout ******************************************************************
            splitPane = new SplitPane();
            borderPane_stackPane_2 = new BorderPane();
            toolBar = new ToolBar();
            vbox_toolBar = new VBox();
     
            // tableViewPanel **********************************************************
            tableViewPanel = new TableViewPanel(facade, this);
     
            // ToolBar *****************************************************************
            toolBar.setStyle("-fx-background-color: DARKSLATEGRAY");
            button_AddMaterial = new Button();
            button_AddMaterial.setText(Messages.getString("button_AddMaterial"));
            toolBar.getItems().add(button_AddMaterial);
     
     
            // vbox_toolBar ************************************************************
            vbox_toolBar.getChildren().add(toolBar);
     
            // SplitPane ***************************************************************
            stackPane_1 = new StackPane();
            stackPane_2 = new StackPane();
            borderPane_stackPane_2.setTop(vbox_toolBar);
            borderPane_stackPane_2.setBottom(tableViewPanel);
            stackPane_2.getChildren().add(borderPane_stackPane_2);
            stackPane_3 = new StackPane();
            splitPane.getItems().addAll(stackPane_1, stackPane_2, stackPane_3);
            Platform.runLater(() -> splitPane.setDividerPositions(0.12, 0.3));
     
            this.getChildren().add(splitPane);
        }
     
    }

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    extends Region, Pane, AnchorPane, <ce que tu veux> et si besoin surcharger layoutChildren() dans le cas ou tu veux effectuer ta propre mise en page (ce qui est nécessaire en général pour Region et Pane).
    Je conseille StackPane pour débuter comme ça y a rien de special a faire.
    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

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Mais j'extends de Region ! .
    Bon, je vais essayer autre chose...

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben faut alors surcharger layoutChildren() et faire la mise en page de manière idoine. Region est un nœud basique, il va pas redimensionner son contenu magiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    protected void layoutChildren() {
       final double width = getWidth();
       final double height = getHeight();
       final Insets insets  = getInsets(); // La marge due au padding ou à la bordure.
       final areaX = insets.getLeft();
       final areaY = insets.getTop();
       final areaW = Math.max(0, width - (insets.getLeft() + insets.getRight());
       final areaH = Math.max(0, height - (insets.getTop() + insets.getBottom());
       [...]
    }
    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

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Merci pour ton aide,

    Finalement, j'extends StackPane et ça fonctionne.

    Marc

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

Discussions similaires

  1. [JFrame] Redimensionnement Fenêtre (GridBag)Layout
    Par lac981 dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 08/08/2013, 09h52
  2. [Flex4] Redimensionnement de conteneurs
    Par alband85 dans le forum Flex
    Réponses: 2
    Dernier message: 19/08/2010, 12h10
  3. Usercontrol redimensionné dans conteneur
    Par pink976 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/04/2008, 14h23
  4. Redimensionner JButton dans son conteneur
    Par chico_du_33 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/12/2006, 18h40
  5. [SWT][Layout]problème de redimensionnement d'un Text
    Par McFoggy dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 05/08/2004, 12h10

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