【问题标题】:How to disable a node without greying it out in JavaFX?如何在 JavaFX 中禁用节点而不使其变灰?
【发布时间】:2016-07-12 10:32:36
【问题描述】:

我的问题是能够禁用Node,这样用户在我打印它时就无法与之交互。尽管如此,我需要整个Node(在本例中为GridPane)及其所有子项(主要是按钮和标签)在打印过程中不能被用户交互。

当我写setDisable 时,它会使整个Node 变灰,但我想保留Node 禁用时的原始颜色和状态。

有没有办法做到这一点?无论是通过disableProperty 还是其他方式,对我来说都不是特别重要。这里的关键是您不能与Node 进行交互。

提前致谢

【问题讨论】:

  • 我还要提到添加 ProgressIndicator 或 Animation 以便用户可以看到正在发生的事情。

标签: java css javafx


【解决方案1】:

我找到了答案:

来自@awksp “JavaFX 中的所有节点都有一个setMouseTransparent() 方法,详见此处,其中 mouseTransparent 属性为:

If true, this node (together with all its children) is completely transparent to mouse events. When choosing target for mouse event, nodes with mouseTransparent set to true and their subtrees won't be taken into account...."

然后我进一步使用了setFocusTraversable(false),这样您就无法通过其他方式聚焦它来与节点交互

感谢@awksp 的帮助: https://stackoverflow.com/a/24164911/6197978

【讨论】:

  • 仍然无助于触摸和手势事件。
  • 没有专门测试过,但我试着回忆一下我曾经遇到过的类似案例。不过,也许我错了。
  • 还可以尝试在打印期间将节点的事件调度程序设置为 null,然后在打印后返回到在将其设置为 null 之前分配的事件调度程序。我相信应该同时处理触摸和鼠标(任何 InputEvent)事件。 @see Node.setEventDispatcher(EventDispatcher)
【解决方案2】:

你可以去modena.css看看:

/* ====   DISABLED THINGS   ================================================= */
.label:disabled,
.button:disabled,

 ... a lot more control here ...

.table-cell:selected:disabled,
.tree-table-cell:selected:disabled {
    -fx-opacity: 0.4;
}

这意味着当 disabled 选择器存在时,它将把 -fx-opacity 属性从默认的 1.0 设置为 0.4。

不透明度在概念上可以被认为是一种后处理操作。 从概念上讲,在节点(包括其后代)被渲染之后 进入 RGBA 屏幕外图像,不透明度设置指定如何 将离屏渲染混合到当前的合成渲染中。

您可以在您的 css 中包含此内容,以移除 any 控件上的不透明度更改:

* :disabled {
    -fx-opacity: 1;
}

【讨论】:

  • 感谢您的回答。在通过使用setStyle("-fx-opacity: 1;") 并更改不透明度将禁用设置为true 后,我确实尝试重新加载新样式表,但由于某种原因它并没有改变它。我找到了另一个解决方案,但感谢您的帮助。
【解决方案3】:

css 可以解决您使用 disabled 属性的问题。并更改背景和文本颜色。 以下是组合框的 css,但你可以取其中的一部分。

.transparent:disabled, .transparent:disabled .arrow-button .arrow, .transparent:disabled .combo-box-base {
     -fx-background-color: #ffffff;
     -fx-opacity: 1;
     -fx-text-fill:#000000;
 }

有关更多信息,请参阅下面的 javafx 中的 css 参考指南链接

https://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html

【讨论】:

  • 感谢您的帮助。暂时我将使用另一种解决方案,因为它对我来说是最简单的,并且似乎可以毫无问题地工作。如果它稍后出现问题,那么我一定会使用你的和@DVarga 的解决方案重做代码。
【解决方案4】:

在我的例子中,我正在做井字游戏,我需要在按下按钮后禁用按钮,但不透明度与以前相同。所以我只是设置了不透明度。

像这样……

 public void actions(){
       one.setOnMouseClicked(e->{
               one.setText("X");
               one.setDisable(true);
               one.setOpacity(1);
       });

}

我希望它可以帮助某人。

【讨论】:

    【解决方案5】:

    如果你想让一个特定的窗格不灰显,你可以添加下面的 CSS 样式表。

    JavaFX

    node.getStyleClass().add("pane_opacity");
    

    CSS

    .pane_opacity:disabled .label:disabled,
    .pane_opacity:disabled .button:disabled,
    .pane_opacity:disabled .toggle-button:disabled,
    .pane_opacity:disabled .radio-button:disabled,
    .pane_opacity:disabled .check-box:disabled,
    .pane_opacity:disabled .hyperlink:disabled,
    .pane_opacity:disabled .menu-button:disabled,
    .pane_opacity:disabled .split-menu-button:disabled,
    .pane_opacity:disabled .slider:disabled,
    .pane_opacity:disabled .scroll-bar:disabled,
    .pane_opacity:disabled .scroll-pane:disabled,
    .pane_opacity:disabled .progress-bar:disabled,
    .pane_opacity:disabled .progress-indicator:disabled,
    .pane_opacity:disabled .text-input:disabled,
    .pane_opacity:disabled .choice-box:disabled,
    .pane_opacity:disabled .combo-box-base:disabled,
    .pane_opacity:disabled .date-cell:disabled > *, /* This is set on children so border is not affected. */
    .pane_opacity:disabled .list-view:disabled,
    .pane_opacity:disabled .tree-view:disabled,
    .pane_opacity:disabled .table-view:disabled,
    .pane_opacity:disabled .tree-table-view:disabled,
    .pane_opacity:disabled .tab-pane:disabled,
    .pane_opacity:disabled .titled-pane:disabled > .title,
    .pane_opacity:disabled .accordion:disabled > .titled-pane > .title,
    .pane_opacity:disabled .tab-pane > .tab-header-area > .headers-region > .tab:disabled,
    .pane_opacity:disabled .menu:disabled,
    .pane_opacity:disabled .menu-item:disabled > .label,
    .pane_opacity:disabled .menu-item:disabled,
    .pane_opacity:disabled .list-cell:filled:selected:focused:disabled,
    .pane_opacity:disabled .list-cell:filled:selected:disabled,
    .pane_opacity:disabled .tree-cell:filled:selected:focused:disabled,
    .pane_opacity:disabled .tree-cell:filled:selected:disabled,
    .pane_opacity:disabled .tree-cell > .tree-disclosure-node:disabled,
    .pane_opacity:disabled .tree-table-row-cell > .tree-disclosure-node:disabled,
    .pane_opacity:disabled .table-row-cell:selected:disabled,
    .pane_opacity:disabled .tree-table-row-cell:selected:disabled,
    .pane_opacity:disabled .table-cell:selected:disabled,
    .pane_opacity:disabled .tree-table-cell:selected:disabled {
        -fx-opacity: 1;
    }
    

    【讨论】:

      【解决方案6】:

      使用node.setDisable(true); 禁用节点,使用node.setStyle("-fx-opacity: 1"); 防止节点失去透明度。

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 2019-01-08
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2011-09-18
        • 2015-07-30
        相关资源
        最近更新 更多