JavaFX 自定义控件可选择可复制Label

JavaFX默认的Label和Text不支持选择复制,本文介绍了两种实现可复制Label的方法:通过修改TextField和TextArea样式,以及自定义控件利用Text的特性。自定义控件实现了双击选词,三击全选,以及Ctrl-C复制文本的功能,并已集成到easyfx框架中。
摘要由CSDN通过智能技术生成

不像网页上面的文字,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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值