Texte avec Icône sur MenuItem JavaFX


Je travaille sur un projet utilisant JavaFX. J'ai inclus FontAwesome dans mon projet pour éviter d'utiliser des images pour de simples icônes. J'ai créé la fonction suivante dans une classe constantes qui génère une HBox avec une icône et du texte qui sera appelé dans le setGraphic(Node node). La fonction est la suivante:

public static HBox iconText(String icon, String text) {
    return ConstantsClass.iconText(icon, text, 5);
}

public static HBox iconText(String icon, String text, int spacing) {
    HBox box = new HBox(spacing);
    Label iconLabel = new Label(icon);
    iconLabel.setFont(ConstantsClass.fontAwesome);
    Label textLabel = new Label(text);
    box.getChildren().addAll(iconLabel, textLabel);
    return box;
}

La méthode fonctionne parfaitement sur les boutons, comme avoir un bouton de retour avec une icône de flèche. Cependant, il ne semble pas fonctionner sur MenuItems.

J'ai une barre de menu en haut de mon application avec des menus en eux, et MenuItems dans ceux-ci. J'ai essayé le même processus avec un MenuItem "paramètres", mais le texte n'apparaît que si le curseur est sur l'élément.

MenuItem settings = new MenuItem();
settings.setGraphic(ConstantsClass.iconText(FontAwesome.COG, "Settings")); //Obscuring name of Constants Class

Ce code a les résultats suivants:

Lorsque l'utilisateur clique sur le menu déroulant

Lorsque l'utilisateur survole l'élément de menu

Comment puis-je faire en sorte que le MenuItem affiche toujours l'icône et le texte?

Author: JoseRivas1998, 2017-04-04

1 answers

C'est un peu bizarre, il ressemble à bug. Si il n'y a pas d'étiquette dans le graphique, le graphique semble affichage OK (par exemple un rectangle semble fonctionner correctement, comme un graphique). Je suppose que c'est une sorte de gâchis dans l'interaction entre les règles de style CSS et l'implémentation de la peau du menu.

Une solution de contournement consiste à utiliser un instantané, mais cela rend en quelque sorte l'instantané légèrement gras.

cassé cassé en évidence instantané fixe

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class MenuDisplay extends Application {
    public void start(Stage stage) throws Exception {
        Label label = new Label("(*)");
        label.setStyle("-fx-background-color: null;");
        Scene dummyScene = new Scene(label, Color.TRANSPARENT);
        SnapshotParameters params = new SnapshotParameters();
        params.setFill(Color.TRANSPARENT);
        Image snapshot = label.snapshot(params, null);
        ImageView imageView = new ImageView(snapshot);

        Menu menu = new Menu("Choices");
        menu.getItems().addAll(
            new MenuItem("Broken Label Graphic", new Label("(*)")),
            new MenuItem("OK Rect", new Rectangle(16, 16, Color.FORESTGREEN)),
            new MenuItem("Fixed Snapshot", imageView)
        );
        MenuBar menuBar = new MenuBar(menu);

        Scene scene = new Scene(
                new VBox(menuBar), 100, 100
        );

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Peut-être que quelqu'un d'autre peut trouver une meilleure solution (ou fixer).

 3
Author: jewelsea, 2017-04-04 19:10:09