2016-05-20 5 views
1

Y at-il un moyen de centrer horizontalement le texte dans un javafx.scene.control.ChoiceBox? Je cherche à centrer le texte dans le ChoiceBox, ainsi que la liste déroulante qui s'ouvre lors du processus de sélection d'une valeur.Comment centrer horizontalement du texte dans un fichier JavaFX ChoiceBox

+3

Une option consiste à utiliser ComboBox à la place et à définir ses propriétés cellFactory et buttonCell. – VGR

Répondre

1

Conformément à la recommandation de @VGR, j'ai modifié mon implémentation pour utiliser un javafx.scene.control.ComboBox. Ensuite, j'ai créé une classe appelée CenteredListCell:

import javafx.geometry.Pos; 
import javafx.scene.control.ListCell; 

public class CenteredListCell<T> extends ListCell<T> { 

    /** Default constructor */ 
    public CenteredListCell() { 
     setMaxWidth(Double.POSITIVE_INFINITY); 
     setAlignment(Pos.BASELINE_CENTER); 
    } 

    @Override 
    public void updateItem(final T item, final boolean empty) { 
     super.updateItem(item, empty); 
     setText(empty || item == null ? null : item.toString()); 
    } 

} 

Ensuite, j'ai créé la méthode utilitaire suivant (grâce à @kleopatra pour l'inspiration qui mènent à runWhenSkinned):

private static void runWhenSkinned(final Control control, final Runnable operation) { 
    final ReadOnlyObjectProperty<?> skinProperty = control.skinProperty(); 
    if (skinProperty.get() == null) { 
     // Run after the control has been skinned 
     skinProperty.addListener(observable -> Platform.runLater(operation)); 
    } else { 
     // Run now, since the control is already skinned 
     operation.run(); 
    } 
} 

public static <T> void center(final ComboBox<T> comboBox) { 
    runWhenSkinned(comboBox,() -> { 
     // Get the width of the combo box arrow button 
     final Region arrow = (Region)comboBox.lookup(".arrow-button"); 
     final double arrowWidth = arrow.getWidth(); 

     // Create a centered button cell 
     final ListCell<T> buttonCell = new CenteredListCell<T>(); 
     comboBox.setButtonCell(buttonCell); 

     // Create an insets object with uneven horizontal padding 
     final Insets oldPadding = buttonCell.getPadding(); 
     final Insets newPadding = new Insets(oldPadding.getTop(), 
       arrowWidth, oldPadding.getBottom(), 0); 

     // Replace the default cell factory 
     comboBox.setCellFactory(listView -> new CenteredListCell<T>() { 
      { setPadding(newPadding); } 
     }); 
    }); 
} 

Le résultat final est un ComboBox avec du texte centré dans la cellule de bouton et dans la liste des éléments.

+1

vous pouvez enregistrer un écouteur à la propriété de la zone de liste déroulante et appeler la méthode utilitaire lorsque vous recevez une notification d'un nouveau modèle – kleopatra