如何基于其他面板的滚动条添加动态滚动条?

时间:2015-02-23 10:40:42

标签: javafx javafx-2

首先完成我的演示程序。

enter image description here

在上面的图像组件层次结构中 JFRAme将包含
调整JSplitPane
在split [Horizo​​ntal]中都有JFXPanels 每个JFXPanel都包含ScrollPane [javafx]

现在,您可以从图像中看到右侧面板包含水平滚动条,该滚动条向上[与滚动条的高度相同] JFXPanel的内容。
而在左侧面板中没有滚动条。

我的要求是在调整窗口大小时[通过最小化,最大化,拖动窗口...无论如何]面板的内容必须对齐。要做到这一点,面板应该有水平滚动条,而不是任何一个。

现在左侧面板不可调整大小,因此在任何调整窗口大小的情况下,只有右侧面板会调整大小。

因此,在调整窗口大小时,如何识别左侧面板中是否应添加滚动条? 此外,我知道如何添加滚动条,但重要的是我应该在哪里放置代码,以便仅在调整窗口大小时执行?

1 个答案:

答案 0 :(得分:0)

这对我有用。这有点像黑客攻击:对于一个,你必须使用查找来获取滚动条;而且我必须假设ScrollPane实现只是设置滚动条的可见属性来显示/隐藏它(例如,与在场景图中添加和删除它相反)。

这个例子是所有JavaFX,没有Swing,但我认为它应该很容易翻译到你的上下文。我在Java 8下进行了测试,我认为它应该在Java 7下使用JavaFX 2进行编译。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TwoScrollPanes extends Application {

    @Override
    public void start(Stage primaryStage) {

        final SplitPane split = new SplitPane();
        final ScrollPane scrollPane1 = makeScrollPane(Control.USE_PREF_SIZE);
        final ScrollPane scrollPane2 = makeScrollPane(250);


        // if you want the vertical scrollbars to scroll in unison:
        scrollPane1.vminProperty().bindBidirectional(scrollPane2.vminProperty());
        scrollPane1.vmaxProperty().bindBidirectional(scrollPane2.vmaxProperty());
        scrollPane1.vvalueProperty().bindBidirectional(scrollPane2.vvalueProperty());

        split.getItems().addAll(scrollPane1, scrollPane2);

        Scene scene = new Scene(split, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();

        Node rightHorizScroller = null ;
        for (Node n : scrollPane2.lookupAll(".scroll-bar")) {
            ScrollBar sb = (ScrollBar) n;
            if (sb.getOrientation() == Orientation.HORIZONTAL) {
                rightHorizScroller = sb ;
            }
        }

        if (rightHorizScroller != null) {
            scrollPane1.hbarPolicyProperty().bind(
                    Bindings.when(rightHorizScroller.visibleProperty())
                        .then(ScrollBarPolicy.ALWAYS)
                        .otherwise(ScrollBarPolicy.NEVER));
        }
    }

    private ScrollPane makeScrollPane(double minLabelWidth) {
        ScrollPane scrollPane = new ScrollPane();
        VBox content = new VBox();
        for (int i = 1; i <= 100; i++) {
            Label label = new Label("Item "+i);
            label.setMinWidth(minLabelWidth);
            content.getChildren().add(label);
        }
        scrollPane.setContent(content);
        return scrollPane ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}