首页 > 解决方案 > 设置菜单项css字体样式没有可见效果

问题描述

当用户单击它时,我想将 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 不会在视觉上改变任何东西)。

没有大胆的效果。- 仅当您在 initialize() 中设置样式时

我很好奇为什么它没有区别?它确实将样式设置为粗体,但即使将其更改为粗体,它也会显示为常规字体。

编辑: JavaFX 版本:8.0.211-b10

标签: cssjavafxmenuitemfont-style

解决方案


如果我必须坚持使用 javafx 8 并且需要切换,我会使用 RadioMenuItem。它按预期完成工作,但不会使 MenuItem 文本变为粗体。

从官方文档中,我发现以下摘录很有用。

ToggleGroup toggleGroup = new ToggleGroup();

RadioMenuItem radioItem1 = new RadioMenuItem("Option 1");
radioItem.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
    System.out.println("radio toggled");
}
});
radioItem1.setToggleGroup(toggleGroup);
RadioMenuItem radioItem2 = new RadioMenuItem("Option 2");
radioItem.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
    System.out.println("radio toggled");
}
});

radioItem2.setToggleGroup(toggleGroup);

推荐阅读