【问题标题】:JavaFX - Get Rid of `CustomMenuItem` blue highlight?JavaFX - 摆脱“CustomMenuItem”蓝色突出显示?
【发布时间】:2016-03-12 08:22:33
【问题描述】:

当悬停在 ContextMenu 实现上时,我一直在努力删除蓝色突出显示。

private void attachContextMenu() {
    CustomMenuItem item = FilterPanel.getInMenuItem(this);
    ContextMenu contextMenu = new ContextMenu();
    contextMenu.getItems().add(item);


    tableColumn.setContextMenu(contextMenu);
}

通过包含VBox,我能够将其涂成白色并消除大部分蓝色闪光。

filterVBox.setStyle("-fx-background-color: white;");

但我不知道如何让CustomerMenuItem 在用鼠标聚焦时失去蓝色边框。我尝试了以下方法,但它不起作用

CustomMenuItem item = FilterPanel.getInMenuItem(this);
item.setStyle("-fx-text-fill: white;");

如果你想要完整的图片,这里是PR,但是有人知道我可以如何操纵它来消失吗?

我可以通过使用这个 CSS 为整个 TableView 设计每个 MenuItem 来消除它。但我想将它专门应用于just CustomMenuItem

.menu-item:focused {
   -fx-background-color: transparent;
}

【问题讨论】:

  • 给你表一个类并做“.table .menu-item:focused {..}”不是一个选项吗?
  • 你有没有试过找出是哪个元素引起了ScenicView的突出显示?从style description 开始,上下文菜单是一个复合控件。

标签: java css javafx


【解决方案1】:

由于在 ContextMenu 获得焦点时会出现蓝色突出显示,因此您在此处处理的是 Pseudoclass。在 CSS 中,伪类用于定义节点的特定状态。典型的状态是悬停、选择、聚焦...

解决此问题的方法是添加一个 CSS 文件,您可以在其中轻松地将样式设置应用于任何可能的状态。

首先,将样式类应用到您的ContextMenu(这样使用上下文菜单的其他控件就不会受到这些设置的影响)。比如column-filter:

private void attachContextMenu() {
    CustomMenuItem item = FilterPanel.getInMenuItem(this);

    ContextMenu contextMenu = new ContextMenu();
    contextMenu.getStyleClass().add("column-filter");

    contextMenu.getItems().add(item);
    tableColumn.setContextMenu(contextMenu);
}

然后将所需的样式规则添加到一个 css 文件中:

style.css

.column-filter .context-menu {
    -fx-background-color: white;
}

.column-filter .context-menu:focused {
    -fx-background-color: white;
}

.column-filter .custom-menu-item {
    -fx-background-color: white;
    -fx-padding: 0;
}

.column-filter .custom-menu-item:focused {
    -fx-background-color: white;
}

最后你需要将这个样式表应用到场景中:

scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

你会摆脱高光。

【讨论】:

  • 太棒了。工作完美谢谢。由于 API 无法直接访问使用它的 Scene,它确实可以访问 TableView,因此我将 CSS 表添加到该控件。
  • 感谢您克服克隆这个问题。
  • 没问题,我已经克隆了 ControlsFX!是的,合乎逻辑的方法是将tablefilter.css 添加到 ControlsFX 资源中,并默认在TableFilter 构造函数上加载它:tableView.getStylesheets().add(getClass().getResource("/org/controlsfx/control/tablefilter.css").toExternalForm());
  • 我刚刚提交了一个 PR,并在此处链接以感谢您。谢谢! bitbucket.org/controlsfx/controlsfx/pull-requests/580/…
  • 谢谢,现在您也可以从代码中删除setStyle() 调用。
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 2018-12-30
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多