JavaFX同步滚动窗格内容更改及其Vvalue

时间:2015-07-06 04:32:36

标签: javafx javafx-8

我有一个包含5个Titledpanes(类别)的Scrollpane,每个包含2个图像。每个TitledPane的高度在展开状态下为200,在折叠状态下为25。

这是图片:

Launch screen

我有一个文本字段,我可以在其中输入要选择的图像的编号。

例如,如果我输入" 4",滚动窗格将滚动到Category-2中的Image-4,如下所示。

Expected

我可以通过根据要滚动的高度和滚动窗格内的内容的总高度计算滚动窗格的V值来实现此目的。

以下是问题

在上面的例子中,如果类别2被折叠,我必须"展开"然后转到Image-4。

我是通过使用以下代码算法来做到这一点的:    //让处于折叠状态的TitledPane-2的滚动窗格内容的高度为( ht_ScrollPaneBefore = 825),ScrollPane视图端口高度为( ht_Viewport = 180)。让TitledPane-2扩展后的滚动窗格的ht为 ht_ScrollPaneAfter ,这是在以下算法的步骤3中计算的。

{       
   ....
   1. Expand TitledPane-2
   2. Call applyCss() and layout() on the TitledPane to make the Expansion effective.(As addressed in the other query : https://stackoverflow.com/questions/26152642/get-the-height-of-a-node-in-javafx-generate-a-layout-pass)
   3. Get the height of the total Content(ht_TotalContent) of the scroll pane with the expanded TitledPane-2.(ht_ScrollPaneAfter = 1000)
   4. ******  Calculate the Vvalue based on (ht_TotalContent).(let it be Vvalue = 0.56) ***** 
   5. Set the Vvalue to the scrollpane.
   ....
}

问题

由于Titledpane的扩展尚未应用" Visually"在视图上,Vvalue(0.52)相对于ht_ScrollpaneBefore(800)被应用,这导致不正确的滚动ht,如"实际输出"下方。

实际输出:

Actual

预期:

Expected

注意:使用链接Get the height of a node in JavaFX (generate a layout pass)中描述的过程成功获得了TitledPane-2扩展后滚动窗格的ht。 Vvalue的计算基于ht_ScrollPaneAfter not on ht_ScrollPaneBefore。这里唯一的问题是Vvalue的应用程序出错了,因为滚动窗格视图尚未使用扩展的TitledPane-2进行更新。

代码示例:

    private void scrollToImage() {
            int imageNum = Integer.parseInt(textField.getText()); // Number entered in text field
            int categoryNum = imageNum / 2 + imageNum % 2; // Which category the image number belongs to.
            Bounds scrollViewBounds = mscr.localToScene(mscr.getBoundsInLocal()); // viewport bounds.

            Platform.runLater(() -> {
                System.out.println("Before: " + mvbx.getHeight());
                titledPaneList[categoryNum - 1].setExpanded(true);
                mvbx.applyCss();
                mvbx.layout();
            });

            double scrollHt[] = {0.0};

            //ht of the categories before selected image category.
            for (int idx = 0; idx < (categoryNum - 1); idx++) {
                scrollHt[0] += titledPaneList[idx].getHeight();
            }

            // check if the image is first/second image in the category.
            int imageIdxInCategory = (imageNum % 2 == 0) ? 1 : 0;

            // If the selected image is second image in the category,
            // add the titlebar and first image ht to the scroll ht.
            if (imageIdxInCategory > 0) {
                scrollHt[0] += 25 //Title bar ht.
                        + titledPaneList[categoryNum - 1].getInsets().getTop() // titled pane top insets
                        + ((VBox) titledPaneList[categoryNum - 1].getContent()).getChildren().get(0).getBoundsInLocal().getHeight(); // ht of the first image
                // Note: Since, my titledpane contains a vbox which contains the
                //   image number label and imageview,
                //   I am calculating the ht of the first vbox her in the above code.
            }

            Platform.runLater(() -> {
                System.out.println("After: " + mvbx.getHeight());
                double d_ScrollHtPerPix = 1
                        / (mvbx.getHeight()
                        - (scrollViewBounds.getHeight() - mscr.getInsets().getTop() - mscr.getInsets().getBottom()));
                mscr.setVvalue(scrollHt[0] * d_ScrollHtPerPix);
            });
        }
    }

输出

折叠所选图像的类别时,

之前:825

之后:825

如您所见,即使在展开折叠类别后,滚动窗格内容的高度也相同。

0 个答案:

没有答案