设置JavaFX-CSS改变TreeView节点图标

1.      实现以“+”、“-”表示节点图标

JavaFX中TreeView的默认节点图标如下图所示:

 

其中箭头向下表示展开,向右则表示合拢。

 

设置css就可以改变TreeView的样式。比如使用下面几行的css定义,就可以实现“+”表示合拢,“-”表示展开。

复制代码
.tree-cell .tree-disclosure-node .arrow {
    -fx-shape: "M 0 -1 L 3 -1 L 3 -4 L 5 -4 L 5 -1 L 8 -1 L 8 1 L 5 1 L 5 4 L 3 4 L 3 1 L 0 1 z";   
}

.tree-cell:expanded .tree-disclosure-node .arrow {
    -fx-rotate: 0;
  -fx-scale-shape: false;
    -fx-shape: "M 0 -1 L 7 -1 L 7 1 L 0 1 z";
}
复制代码

 

这是改变后的效果:

 

 

2.      JavaFX中默认TreeView样式定义

在JavaFX的com.sun.javafx.scene.control.skin.caspian的包中,有一个caspian.css文件,里面定义了JavaFX的默认样式。 

打开文件,搜索“Treeview”,可以找到如下内容:

复制代码
/************************************************************************
 *                                                                      *
 * TreeView and TreeCell                                                *
 *                                                                      *
 ************************************************************************/ 
.tree-view {
    -fx-skin: "com.sun.javafx.scene.control.skin.TreeViewSkin";
    -fx-background-color: -fx-box-border, -fx-control-inner-background;
    -fx-background-insets: 0, 1; 

    /* There is some oddness if padding is in em values rather than pixels,
       in particular, the left border of the control doesn't show. */
    -fx-padding: 1; /* 0.083333em; */
}
复制代码

 

其中跟节点图标有关的定义有:

复制代码
.tree-cell.tree-disclosure-node.arrow {
    -fx-background-color: -fx-mark-color;
    -fx-padding: 0.333333em; /* 4 */
    -fx-shape: "M 0 -4 L 8 0 L 0 4 z";
}
.tree-cell:expanded.tree-disclosure-node.arrow { -fx-rotate: 90; } .tree-cell:filled:hover .tree-disclosure-node .arrow { -fx-background-color: -fx-mark-color; } .tree-cell:filled:selected .tree-disclosure-node .arrow { -fx-background-color: -fx-selection-bar-text; } .tree-cell:filled:selected:hover .tree-disclosure-node .arrow { -fx-background-color: -fx-selection-bar-text; }
复制代码

 

3.      简单介绍SVG路径字符串

先注意其中前两个高亮显示的定义。“-fx-shape”是一个SVG的路径字符串,用来画图形。M代表moveTo,L代表lineTo,最后的z表示连接当前点到初始点,使形状闭合。如图:

 

由此可知,在这里使用“-fx-shape”绘制了一个向右的箭头,是TreeItem的关闭状态。后面的“.tree-cell:expanded .tree-disclosure-node .arrow”理所当然就是展开状态,这倒是很简单,“-fx-rotate: 90;”表示顺时针旋转90度,即箭头冲下。

 

默认样式就是这个原理。把前面写的两个选择器放在项目的css文件中,就可以覆盖默认样式。其中的:

-fx-shape: "M 0 -1 L 3 -1 L 3 -4 L 5 -4 L 5 -1 L 8 -1 L 8 1 L 5 1 L 5 4 L 3 4 L 3 1 L 0 1 z";

就是手工画了一个“+”号,如图:

 

在SVG路径字符串中,还可以用“H x”或者“V y”代替“L x y”。“H x”表示从当前位置画水平直线到位置“x”,“V y”则表示从当前位置画垂直线到位置“y”。

 

这样之前的两个选择器可以写成下面的样子,看上去精简了很多:

复制代码
.tree-cell .tree-disclosure-node .arrow {
    -fx-shape: "M 0 -1 H 3 V -4 H 5 V -1 H 8 V 1 H 5 V 4 H 3 V 1 H 0 z"
} 

.tree-cell:expanded .tree-disclosure-node .arrow {
    -fx-rotate: 0;
    -fx-scale-shape: false;
    -fx-shape: "M 0 -1 H 7 V 1 H 0 z";
}
复制代码

 

4.      CSS属性覆盖

注意,新的选择器仅仅覆盖了“-fx-shape”属性,其他两个属性,-fx-background-color和-fx-padding仍然原样保留。也是因此,在“.tree-cell:expanded”中一定要有 “-fx-rotate: 0;”,否则仍然会执行旋转90度,把画的“-”变成“|”。

 

还有,在“.tree-cell:expanded”中还多了属性“-fx-scale-shape: false”。该属性默认为“true”,会把画出的“-”号放大成一个矩形。

5.      Win7 Style

上面提到5个关于节点图标的选择器中,其他3个描述的是鼠标经过,以及节点被选择时的样式。比如下面的定义实现了Win7效果的TreeView样式:

复制代码
.tree-cell .tree-disclosure-node .arrow {
    -fx-scale-shape: false;

    -fx-background-color: transparent; 
    -fx-shape: "M 0 4 L 0 -4 L 5 0 z";
    -fx-border-color: grey;
    -fx-border-width: 0.083333em;   
}

.tree-cell:expanded .tree-disclosure-node .arrow {
    -fx-scale-shape: false;
   
    -fx-background-color: -fx-mark-color;
    -fx-rotate: 0; 
    -fx-shape: "M 0 3 L 6 -3 L 6 3 z";
    -fx-border-width: 0.083333em; 
} 

.tree-cell:filled:hover .tree-disclosure-node .arrow {
    -fx-background-color: transparent;
    -fx-border-color: cyan;
} 

.tree-cell:filled:selected .tree-disclosure-node .arrow {
    -fx-border-color: cyan;
}

.tree-cell:filled:selected:hover .tree-disclosure-node .arrow {
    -fx-border-color: cyan;
}
复制代码

 

效果如图:

 

不是太象,应该是有几个JavaFX-CSS还没掌握。

 

参考资料:

1. JavaFX CSS Reference Guide (http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html)

2. SVG 1.1 (Second Edition) – 16 August 2011 (http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX-Support是一个开源项目,致力于为JavaFX提供友好的支持和工具。JavaFX是一个用于构建丰富用户界面的Java库,而JavaFX-Support项目旨在为开发人员提供便利和增强功能,以提高他们在开发JavaFX应用程序时的效率和体验。 JavaFX-Support项目具有以下特点和功能: 1.样式编辑器:JavaFX-Support项目提供了一个样式编辑器,使开发人员能够轻松编辑和定制JavaFX应用程序的视觉样式。通过这个编辑器,开发人员可以直观地调整应用程序的颜色、字体和其他视觉元素,而无需手动编写代码。 2.视觉组件库:JavaFX-Support项目还包含了一个丰富的视觉组件库,开发人员可以直接在应用程序中使用这些组件,而无需自己编写。这些组件可以帮助开发人员快速构建出现频率较高的界面元素,例如按钮、文本框、列表等。 3.布局助手:JavaFX-Support项目还提供了一个布局助手,用于在JavaFX应用程序中进行布局。开发人员可以方便地使用拖放方式调整和排列组件,从而更加灵活地设计界面。 4.调试工具:JavaFX-Support项目还包含了一些调试工具,用于帮助开发人员在开发过程中定位和修复问题。这些工具可以帮助开发人员追踪布局问题、排查异常和提高性能。 总的来说,JavaFX-Support项目是一个强大而实用的工具集,它使得开发人员可以更加便捷地开发和定制JavaFX应用程序。无论是初学者还是有经验的开发人员都可以从中受益,并提高他们在JavaFX开发中的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值