【问题标题】:Separate css rules for dividers of one splitPane一个 splitPane 的分隔符的单独 css 规则
【发布时间】:2017-05-10 19:47:24
【问题描述】:

我在 css 文件中有以下 css 类

.split-pane > .split-pane-divider {  
    -fx-background-insets: 0;
    -fx-padding: 0 0 0 0;  
    -fx-background-color: red;
}

我有一个带有两个分隔线的 splitPane,我将这些分隔线称为 Node(!)。我是说

Node leftDivider;
Node rightDivider;

我通过这种方式获得对它们的引用

List<Node> nodes=getDividerNodes(splitPane);
leftDivider=nodes.get(0);
rightDivider=nodes.get(1);

...
public static List<Node> getDividerNodes(SplitPane splitPane){
    Map<Double,Node> sortedMap=new TreeMap<>();
    if (splitPane.getOrientation()==Orientation.HORIZONTAL){
        splitPane.lookupAll(".split-pane-divider").stream().forEach(div ->  {
            if (div.getParent()==splitPane){
                sortedMap.put(div.getLayoutX(), div);
            }
        });
    }else{
        splitPane.lookupAll(".split-pane-divider").stream().forEach(div ->  {
            if (div.getParent()==splitPane){
                sortedMap.put(div.getLayoutY(), div);
            }
        });
    }
    return new ArrayList<>(sortedMap.values());
}

现在我不想显示 leftDivider 但不显示 rightDivider。我愿意

leftDivider.setStyle("-fx-padding: 0 5 0 0;");

但是,我看到了两个分隔线 - 左侧和右侧。此外,如果我只想看到正确的分隔线,我会这样做

rightDivider.setStyle("-fx-padding: 0 5 0 0;");

我没有看到任何分隔符。

在我看来,在一个 splitPane 中单独控制分隔线是不可能的。如果我错了,请说我怎样才能只显示两个分隔线之一?

【问题讨论】:

  • 您能否详细说明如何获得对分隔线的引用?
  • @James_D 我发布了代码。
  • 是的,这看起来像一个错误......

标签: java css javafx


【解决方案1】:

这看起来像一个错误。特别是,SplitPaneSkin 类包含以下方法:

private void layoutDividersAndContent(double width, double height) {
    final double paddingX = snappedLeftInset();
    final double paddingY = snappedTopInset();
    final double dividerWidth = contentDividers.isEmpty() ? 0 : contentDividers.get(0).prefWidth(-1);

    for (Content c: contentRegions) {
//        System.out.println("LAYOUT " + c.getId() + " PANELS X " + c.getX() + " Y " + c.getY() + " W " + (horizontal ? c.getArea() : width) + " H " + (horizontal ? height : c.getArea()));
        if (horizontal) {
            c.setClipSize(c.getArea(), height);
            layoutInArea(c, c.getX() + paddingX, c.getY() + paddingY, c.getArea(), height,
                0/*baseline*/,HPos.CENTER, VPos.CENTER);
        } else {
            c.setClipSize(width, c.getArea());
            layoutInArea(c, c.getX() + paddingX, c.getY() + paddingY, width, c.getArea(),
                0/*baseline*/,HPos.CENTER, VPos.CENTER);
        }
    }
    for (ContentDivider c: contentDividers) {
//        System.out.println("LAYOUT DIVIDERS X " + c.getX() + " Y " + c.getY() + " W " + (horizontal ? dividerWidth : width) + " H " + (horizontal ? height : dividerWidth));
        if (horizontal) {
            c.resize(dividerWidth, height);
            positionInArea(c, c.getX() + paddingX, c.getY() + paddingY, dividerWidth, height,
                /*baseline ignored*/0, HPos.CENTER, VPos.CENTER);
        } else {
            c.resize(width, dividerWidth);                
            positionInArea(c, c.getX() + paddingX, c.getY() + paddingY, width, dividerWidth,
                /*baseline ignored*/0, HPos.CENTER, VPos.CENTER);
        }
    }
}

如您所见,dividerWidth 是针对单个分隔线计算的,并且在所有分隔线的布局中使用相同的值。因此,所有分隔器的尺寸都相同,而不管它们可能具有不同的样式。

我建议您搜索以查看是否已报告此问题(我做了 quick search 并没有找到任何内容),如果没有,请报告。

【讨论】:

  • 很遗憾找不到注册方法。你知道怎么做吗?
  • @Pavel 您可以在没有项目角色的情况下提交错误here(尽管您仍然需要 Oracle 注册:如果您没有注册帐户,您应该会看到一个创建帐户的链接)。
  • 非常感谢您的帮助。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2012-09-14
相关资源
最近更新 更多