1

这个问题困扰了我很多次。例如,我希望启用 a中的ProgressBar图形节点Button,但禁用其父 Button。这样,我可以实现一个看起来很酷的“加载”按钮,该按钮运行一些长时间运行的任务,变成灰色和禁用,但让他的内部 ProgressBar 保持清晰可见,并附上所有明亮的颜色。但是当我禁用按钮时,珍贵的子 ProgressBar 也被禁用并变灰。

今天我又遇到了同样的问题。我有两个Accordions依次堆叠。顶级手风琴有两个TitledPanes,用户可以随意扩展或收缩。但是,下面的 Accordion 只有一个始终展开的 TitledPane。此 TitledPane 具有对用户始终可见的内容和控件。我将所有这些固定内容封装在一个单独的 Accordion 和一个单独的 TitledPane 中,这样他就可以像他的表兄弟一样融入其中。只是穿上普通的Pane或其他的东西,然后试图模仿表兄弟的风格是一件很麻烦的事。请看一下目前的一切:

在此处输入图像描述

但是当固定内容的 TitlePane 获得焦点时,它看起来很难看。标题“发送”像一片湛蓝的天空一样亮起来。所以我试图完全禁用 TitlePane,但可以想象,Button 也会自动禁用:

在此处输入图像描述

但是,与我的第一个 Button 示例和 ProgressBar 一样,我只是简单地说它想要禁用父级,但保持子级不禁用!可能吗?

或者,我可以隐藏 TitledPane 的标题。但我也没有弄清楚如何做到这一点,并在这里提出了这个问题。

4

1 回答 1

1

在我找到真正的解决方案(禁用父级而不是子级)之前,我已经找到了解决方法。只需让标题窗格将焦点转移到按钮!

鉴于标题为“Send”的下 TitledPane 的 fx:id 为“titledPaneSend”,并且 Button 有一个 fx:id“button”,并且控制器类实现了Initializable,请将此代码添加到 initialize 方法:

titledPaneSend.focusedProperty().addListener(new ChangeListener<Boolean>()
        {
            @Override
            public void changed(ObservableValue<? extends Boolean> ov, Boolean from, Boolean to)
            {
                if (to == true)
                    /*
                     * Just calling button.requestFocus() will make
                     * BOTH the TitledPane and the Button become
                     * focused. And apparently, this is a bug:
                     * 
                     *     http://stackoverflow.com/a/14843531/1268003
                     * 
                     * So the fix is to wrap all in a new runnable:
                     */
                    Platform.runLater(new Runnable()
                        {
                        @Override
                        public void run() {
                            button.requestFocus(); }
                        });
            }
        });
于 2013-07-07T16:26:07.437 回答