JavaFX AnchorPane和Tab调整基础屏幕元素

时间:2016-10-26 07:08:16

标签: java javafx

Re:JavaFX Anchorpane和Tab调整基础屏幕元素的大小和擦除

阅读Stack Overflow帖子后 -

这里: JavaFX Panel inside Panel auto resizing

在这里: Resize JavaFX tab when double click

我能够获得下面显示的JavaFX代码,将选项卡的大小调整为最大值 AnchorPane容许尺寸; if()块工作。但是在其他区块 执行底层窗格(主舞台场景)被删除/剪辑 标签最小化。我已经看了好几个小时并尝试了各种各样的东西来刷新主舞台的屏幕,但是所有的UI元素仍未显示。我可以从程序启动时重新加载舞台,但是所有的用户数据 在擦除的屏幕上必须保存等等。

我想过刷新,重新粉刷等等,但我真的不知道在这种情况下该做什么。就像我说的,我彻底搜索这些信息(尤其是 各种堆栈溢出帖子。)

感谢您的评论。

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);
    });

  }

}

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

节点:mainFlowPane

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

节点:tabPane

我的fxml具有以下结构(在TabPane最大化之前):

AnchorPane

FlowPane - 名为mainFlowPane

  • HBox - 包含在FlowPane中

  • GridPane - 包含在FlowPane

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

FlowPane / name不会在else输出中打印出来 控制台,只是TabPane /名称

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

AnchorPane

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

我再次调试了代码,FlowPane看起来仍然存在。 但是当我尝试打印出FlowPane时,我得到以下异常 节点fx:id' s:

节点:null 线程中的异常" JavaFX应用程序线程" java.util.ConcurrentModificationException

这是我的堆栈跟踪:

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)

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

  

JFX项目运行:

     

执行

     

C:\的NetBeans \ workspace8_0 \ WordCounterFXApp \ DIST \ run923058183 \ WordCounterFXApp.jar   使用平台C:\ Program Files \ Java \ jdk1.8.0_101 \ jre / bin / java

     

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

     

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

     

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

     

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

     

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

     

TabPane最小化后 - 节点:applAnchorPane

     

TabPane最小化后 - 节点:tabPane

     

TabPane最小化后 - 节点:mainFlowPane

     

TabPane最小化后 - 节点:flowPaneHBox

     

TabPane最小化后 - 节点:flowPaneGridPane

     

删除目录   C:\的NetBeans \ workspace8_0 \ WordCounterFXApp \ DIST \ run923058183

     

jfxsa运行:

     

建立成功(总时间:10秒)

此打印输出显示FlowPane及其子节点被推送 在TabPane下面?

所以,这可能会显示正在发生的事情。 FlowPane可能在外面 可见区域。在这一点上,我不知道如何修复它...

2016年10月26日

总结一下这个调试练习......

问题:JavaFX AnchorPane和Tab调整基础屏幕元素的大小和擦除

分析:在TabPane最小化时,JavaFx UI不会渲染我的FlowPane 正确地使用其3个结构节点:

AnchorPane

FlowPane - 名为mainFlowPane

  • HBox - 包含在FlowPane中

  • GridPane - 包含在FlowPane

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

在TabPane最大化时,UI重新定位TabPane节点 在FlowPane内到AnchorPane下。关于最小化 以下节点层次结果:

AnchorPane

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

FlowPane - 名为mainFlowPane

  • HBox - 包含在FlowPane中

  • GridPane - 包含在FlowPane

因此,JavaFx UI将TabPane放置如图所示。因此, 带有Node元素的FlowPane被推出UI 舞台/场景视觉显示。为什么UI会这样做呢 比重新定位/最小化显示,而不是移动TabPane 节点???

解决方案:

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

  
    
      。

flowPane.getChildren()添加(tabPane);

             

applAnchorPane.getChildren()添加(flowPane)。

    
  

我做了一些调查,所以现在应该修复用户界面。我现在能够最大化并最小化TabPane与关联的选项卡节点。据我所知,JavaFx节点层次结构现在在min / max Tab之后与Node结构在这两个操作之前相同。问题可能不是编码问题。 JavaFx UI应该以它的方式呈现事物,重新排序各种节点吗?在大约5-7小时的研究中,我找不到任何相关文档。希望我关于此的说明能够帮助处于类似情况的其他人。

感谢Blip / StackExchange评论员,我能够将此问题调试成功。戴着Blip的帽子!非常感谢你的帮助。

0 个答案:

没有答案