不像网页上面的文字,JavaFX的Label和Text都是不能选择复制的,可能有些人偏偏需要这个功能,实现方式也挺多的。
TextFiled、TextArea修改样式
TextField
-fx-padding: 0;
-fx-background-color: transparent
TextField 因为只能单行,所以适合文本不需要换行的Label
TextArea
.text-area {
-fx-padding: 0 ;
}
.text-area .scroll-pane .content{
-fx-background-color: transparent;
}
TextArea 可以多行,但是需要自己设置高度,不然会出现滚动条
动态计算所需要的高度,可以使用JavaFX的FontMetrics。
Toolkit.getToolkit().getFontLoader().getFontMetrics(font)
,接受一个Font对象,返回一个FontMetrics,利用FontMetrics,可以获取getCharWidth(char c)
字符宽度,可以获取getLineHeight()
行高。有了字符宽度和高度,就可以计算出来所有文本需要的高度。
但是有个问题,就是TextArea的换行是根据单词换行的,所以需要对TextArea的文本按空格分隔,计算单词宽度,最终计算出来所需要的行数。比较麻烦的。但也可以实现。
自定义控件实现可复制Label
其实JavaFX的Text控件,是有选择文本的方法的,只是比较简单。
Text text = new Text("Label");
// 设置选择文本起始下标
text.setSelectionStart(0);
// 设置选择文本结束下标
text.setSelectionEnd(1);
// 设置选择文本的颜色
text.setSelectionFill(Color.RED);
效果
除此之外,还有一个方法,可以获取指定坐标的文本下标
public final HitInfo hitTest(Point2D point)
,鼠标点击Text节点,传递过来鼠标在Text节点的相对位置坐标,即可计算出来此点击位置下的文本下标。不理解没关系,自己运行一下下面的代码,就知道了。
text