JavaFX AnchorPane和Tab调整和擦除底层屏幕元素

JavaFX AnchorPane和Tab调整和擦除底层屏幕元素,java,javafx,Java,Javafx,回复:JavaFX Anchorpane和Tab调整和删除底层屏幕元素 读取堆栈溢出日志后- 在这里: 在这里: 我能够获得如下所示的JavaFX代码,将选项卡调整为最大值 锚烷容许尺寸;if()块起作用了。但是在else街区 执行底层窗格(主舞台的场景)被 选项卡最小化。我已经找了好几个小时,尝试了各种方法来刷新主舞台的屏幕,但是仍然没有显示所有的UI元素。我可以从程序启动时重新加载stage,但是所有的用户数据 在被擦除的屏幕上,必须保存等 我曾想过刷新、重新喷漆等,但我真的不知道在这种

回复:JavaFX Anchorpane和Tab调整和删除底层屏幕元素

读取堆栈溢出日志后-

在这里:

在这里:

我能够获得如下所示的JavaFX代码,将选项卡调整为最大值 锚烷容许尺寸;if()块起作用了。但是在else街区 执行底层窗格(主舞台的场景)被 选项卡最小化。我已经找了好几个小时,尝试了各种方法来刷新主舞台的屏幕,但是仍然没有显示所有的UI元素。我可以从程序启动时重新加载stage,但是所有的用户数据 在被擦除的屏幕上,必须保存等

我曾想过刷新、重新喷漆等,但我真的不知道在这种情况下该怎么办。就像我说的,我会彻底搜索这些信息(特别是。 各种堆栈溢出日志。)

谢谢你的评论

if (mouseEvent.getClickCount() == 2) {

  if (!isTabMaximized) {

    TabPane tabPane = (TabPane) namespace.get("tabPane");
    AnchorPane applAnchorPane = 
         (AnchorPane) namespace.get("applAnchorPane");

    applAnchorPane.getChildren().forEach( node -> {

      System.out.println("Node: " + node.getId());
     });

    applAnchorPane.setLeftAnchor(tabPane, 0.0d);
    applAnchorPane.setTopAnchor(tabPane, 0.0d);
    applAnchorPane.setRightAnchor(tabPane, 0.0d);
    applAnchorPane.setBottomAnchor(tabPane, 0.0d);

    applAnchorPane.getChildren().setAll(tabPane);

    isTabMaximized = true;

  }else {

    TabPane tabPane = (TabPane) namespace.get("tabPane");
    AnchorPane applAnchorPane = 
       (AnchorPane) namespace.get("applAnchorPane");

    applAnchorPane.setLeftAnchor(tabPane, 0.0d);
    applAnchorPane.setTopAnchor(tabPane, 495.0d);
    applAnchorPane.setRightAnchor(tabPane, 0.0d);
    applAnchorPane.setBottomAnchor(tabPane, 0.0d);


    //not used commented out --> 
    // applAnchorPane.getChildren().setAll(tabPane);

    isTabMaximized = false;

    applAnchorPane.toBack();
    applAnchorPane.getChildren().forEach( node -> {
      node.toFront();
      System.out.println("Node: " + node.getId());
      node.setVisible(true);
    });

  }
}


if()中println()的我的控制台输出:

节点:mainFlowPane

else中println()的我的控制台输出:

节点:选项卡窗格

我的fxml具有以下结构(在选项卡窗格之前):

锚烷

FlowPane-命名为mainFlowPane

  • HBox-包含在FlowPane中

  • GridPane-包含在FlowPane中

  • TabPane-包含在FlowPane中,名为TabPane

FlowPane/名称未打印到else输出中 控制台,只有选项卡窗格/名称

似乎发生了以下情况: 我的fxml具有以下结构(在最小化选项卡窗格之后):

锚烷

  • TabPane-包含在FlowPane中,名为TabPane
我再次调试了代码,流程窗格看起来仍然存在。 但是,当我尝试打印出FlowPane时,会出现以下异常 节点fx:id的:

节点:空 线程“JavaFX应用程序线程”java.util.ConcurrentModificationException中的异常

这是我的stacktrace:



我发现我从FlowPane的HBox和GridPane中省略了fx:id: 一旦我添加了这些,异常就会消失。现在,我的输出如下:

jfx项目运行:

执行

C:\NetBeans\workspace8\u 0\WordCounterFXApp\dist\run923058183\WordCounterFXApp.jar 使用平台C:\Program Files\Java\jdk1.8.0\u 101\jre/bin/Java

最大化选项卡窗格之前-节点:ApplanCorpane

最大化选项卡窗格之前-节点:mainFlowPane

选项卡窗格最大化之前-节点:FlowPaneBox

选项卡窗格最大化之前-节点:flowPaneGridPane

在TabPane最大化之前-节点:TabPane

最小化选项卡窗格后-节点:ApplanCorpane

最小化TabPane后-节点:TabPane

最小化选项卡窗格后-节点:mainFlowPane

最小化选项卡窗格后-节点:FlowPaneBox

最小化选项卡窗格后-节点:flowPaneGridPane

删除目录 C:\NetBeans\workspace8\u 0\WordCounterFXApp\dist\run923058183

jfxsa运行:

生成成功(总时间:10秒)

此打印输出显示已推送FlowPane及其子节点 在选项卡窗格下面

所以,这可能会说明发生了什么。流程窗格可能位于 可见区域。在这一点上,我不知道如何修复它,但


2016年10月26日

要结束此调试练习

问题是:JavaFX AnchorPane和Tab调整和删除底层屏幕元素

分析:在TabPane最小化上,javafxui不呈现我的流程窗格 正确使用其3个结构节点:

锚烷

FlowPane-命名为mainFlowPane

  • HBox-包含在FlowPane中

  • GridPane-包含在FlowPane中

  • TabPane-包含在FlowPane中,名为TabPane

在TabPane最大化时,UI将TabPane节点从 在流动窗格内至锚烷下方。关于极小化问题 以下节点层次结构结果:

锚烷

  • TabPane-包含在FlowPane中,名为TabPane
FlowPane-命名为mainFlowPane

  • HBox-包含在FlowPane中

  • GridPane-包含在FlowPane中

因此,javafxui放置选项卡窗格,如图所示。因此, FlowPane及其节点元素被推出UI 舞台/场景视觉显示。为什么UI会这样做呢 然后重新定位/最小化显示,而不移动选项卡窗格 节点

解决方案:

我找到了一个解决方案,在else块的末尾添加了两行代码:

flowPane.getChildren().add(选项卡窗格)

applancorpane.getChildren().add(flowPane)

我已经做了一些调查,所以UI现在应该是固定的。我现在可以最大化和最小化带有is关联选项卡节点的选项卡窗格。据我所知,JavaFx节点层次结构现在在一个min/max选项卡之后与这两个操作之前的节点结构相同。问题可能不是编码问题。javafxui是否应该以它的方式呈现事物,以重新排序各个节点?在大约5-7小时的研究中,我找不到任何关于这方面的文档。希望我关于这方面的笔记能帮助其他类似情况的人


多亏了Blip/StackExchange commentor,我才能够成功地调试这个问题。干得漂亮!非常感谢您的帮助。

您是否收到任何错误或异常?感谢您的回复。不,我没有收到任何错误或异常。您是如何运行该程序的?你在用ide吗?我在用NetBeans,最新的开发版本。我在上个月左右更新了IDE
Node: null
Exception in thread "JavaFX Application Thread" java.util.ConcurrentModificationException
    at com.sun.javafx.collections.VetoableListDecorator$VetoableIteratorDecorator.checkForComodification(VetoableListDecorator.java:714)
    at com.sun.javafx.collections.VetoableListDecorator$VetoableIteratorDecorator.hasNext(VetoableListDecorator.java:682)
    at java.lang.Iterable.forEach(Iterable.java:74)
    at wordcounterfxapp.WordCounterFXApp$4.handle(WordCounterFXApp.java:963)
    at wordcounterfxapp.WordCounterFXApp$4.handle(WordCounterFXApp.java:897)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
    at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Deleting directory C:\NetBeans\workspace8_0\WordCounterFXApp\dist\run2084430703
jfxsa-run:
BUILD SUCCESSFUL (total time: 13 seconds)