2017-05-23 1 views
1

Voici mon problème: je voudrais obtenir un volet avec orientation horizontale et une largeur correspondant à son contenu (comme FlowPane), mais si la largeur est trop grande, le volet enveloppe son contenu. Je ne veux pas calculer 'prefWidth' ou 'prefWrappingLength' par la largeur des enfants car ils sont nombreux.JavaFX - FlowPane Autosize

Dans le fil JavaFX FlowPane Autosize, ils donnent des solutions pour l'empaquetage du texte, mais pas pour les mises en page.

Avez-vous quelques conseils pour moi?

Répondre

0

Pour ceux qui sont à la recherche d'une réponse, voici ce que j'ai finalement fait, en ignorant la contrainte abondante enfants:

class RuleBox extends FlowPane { 
    int maxWrapLength; 
    int margin = 30; 

    RuleBox(int maxWrapLength) { 
     super(); 
     this.maxWrapLength = maxWrapLength; 
     getChildren().addListener((ListChangeListener<? super Node>) observable -> actualizeWrapLength(observable.getList())); 
    } 

    private void actualizeWrapLength(ObservableList<? extends Node> list) { 
     new Thread(() -> { 
      try { Thread.sleep(50); 
      } catch (InterruptedException ignored) {} 
      Platform.runLater(() -> { 
       int totalWidth = 0; 
       for(Node n : list) { 
        if(n instanceof Control) totalWidth+=((Control)n).getWidth(); 
        else if(n instanceof Region) totalWidth+=((Region)n).getWidth(); 
       } 
       if(totalWidth+margin>maxWrapLength) setPrefWrapLength(maxWrapLength); 
       else setPrefWrapLength(totalWidth+margin); 
      }); 
     }).start(); 
    } 

    void actualizeWrapLength() { 
     actualizeWrapLength(getChildren()); 
    } 
} 

Ce code est assez sale, en particulier pour le Thread.sleep(50) utilisé pour avoir la largeur finale de enfants. Donc, si quelqu'un possède une meilleure solution, s'il vous plaît donnez-le!