我正在使用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始终显示图标和文字?
答案 0 :(得分:3)
它看起来像bug有点奇怪。如果图形中没有标签,则图形似乎显示OK(例如矩形似乎可以正常显示为图形)。我的猜测是CSS样式规则和菜单外观实现之间的交互是一种混乱。
一种解决方法是使用快照,但这会以某种方式使得快照的外观略微加粗。
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);
}
}
也许其他人可以提出更好的解决方法(或修复)。