【发布时间】:2019-08-26 18:21:16
【问题描述】:
当用户单击它时,我想将 MenuItem 的文本更改为粗体。为了做到这一点,我使用了setStyle,但不幸的是它没有明显的效果。当用户选择 MenuItem 选项时,css 不起作用。 css 样式只对初始化方法有影响。
我为这个问题创建了一个最小的可重现示例:
主要:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public final class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("MainView.fxml"));
Scene scene = new Scene(root, 850.0, 650.0);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
主要 FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane prefHeight="475.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="MainController">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu fx:id="menu" mnemonicParsing="false" text="Switch Chart">
<items>
<MenuItem text="MenuItem1" />
<MenuItem onAction="#setFontBold" text="MenuItem2" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
</BorderPane>
主控制器:
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
public class MainController implements Initializable {
@FXML private Menu menu;
private List<MenuItem> menuItems;
@Override
public void initialize(URL location, ResourceBundle resources) {
menuItems = menu.getItems();
menuItems.get(0).setStyle("-fx-font-weight: bold");
}
public void setFontBold() {
menuItems.get(1).setStyle("-fx-font-weight: bold");
System.out.println(menuItems.get(1).getStyle());
System.out.println("Font set to bold in menuitem with index 1 has no effect...");
}
}
因此,即使在选择第一个索引菜单项之后,我也会得到以下 css 效果(因此 onAction=#setFontBold 不会在视觉上改变任何东西)。
No bold effect. - only if you set the style in initialize()
我很好奇为什么它没有区别?它确实将样式设置为粗体,但即使将其更改为粗体,它也会显示为常规字体。
编辑: JavaFX 版本:8.0.211-b10
【问题讨论】:
-
worksforme .. 检查这是否真的是您正在运行的代码:有点怀疑它在初始化时抛出 NPE(因为 fxml 中菜单的 id 错误地以大写字母开头)
-
是的,你是对的。我忘了把它编辑掉。现在好了。尽管如此,带有文本 MenuItem2 的 MenuItem 对我来说仍然是常规字体(即使在我点击它之后)。它真的对你有用吗?那为什么不给我呢? @kleopatra
-
不知道 - 你有哪个版本?我的是 fx11-hach 错过了您的编辑:是的,这可能是一个同时修复的错误.. 不过没有检查。很可能它是 ContextMenu/Container 的皮肤中缺少的侦听器:如果在 MenuItem 上更改了控件的样式(这 不是 控件),则需要一个更新控件的样式但同样,没有检查:)
-
是的,MenuItemContainer(单个 MenuLabel 的父项)最初仅设置样式 (fx),而无需任何努力使其保持同步,在更高版本 (fx11) 中,它将样式属性绑定到商品风格
-
再次感谢您帮助我摆脱克娄巴特拉。无论如何,我计划升级我的 javafx 版本。我应该这样做有一些明显的理由。
标签: css javafx menuitem font-style