MenuItem JavaFx上的图标文本

时间:2017-04-04 17:55:32

标签: java javafx

我正在使用JavaFX开发一个项目。我在我的项目中包含了FontAwesome,以避免将图像用于简单的图标。我在一个常量类中创建了以下函数,该类生成一个HBox,其中包含将在setGraphic(Node node)中调用的图标和文本。功能如下:

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;
}

该方法在按钮上完美运行,例如带有带箭头图标的后退按钮。但它似乎不适用于MenuItems。

我的应用程序顶部有一个菜单栏,其中包含菜单,其中有MenuItems。我使用“settings”MenuItem尝试了相同的过程,但除非光标位于项目上,否则文本不会出现。

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

此代码具有以下结果:

When the user just clicks on the menu drop down

When the user hovers over the Menu Item

如何让MenuItem始终显示图标和文字?

1 个答案:

答案 0 :(得分:3)

它看起来像bug有点奇怪。如果图形中没有标签,则图形似乎显示OK(例如矩形似乎可以正常显示为图形)。我的猜测是CSS样式规则和菜单外观实现之间的交互是一种混乱。

一种解决方法是使用快照,但这会以某种方式使得快照的外观略微加粗。

broken broken highlight fixed snapshot

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);
    }
}

也许其他人可以提出更好的解决方法(或修复)。