【问题标题】:Setting menu items css font style has no visible effect设置菜单项css字体样式没有可见效果
【发布时间】: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


【解决方案1】:

如果我必须坚持使用 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);

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多