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
Répondre
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.
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
Une option consiste à utiliser ComboBox à la place et à définir ses propriétés cellFactory et buttonCell. – VGR