Label
经过前面几节内容,我们已经学会了如何创建一个工程,后续章节均不再重复介绍工程创建。
本小节将带大家学习如何使用JavaFX API中位于javafx.scene.control包中Label类去显示文本元素。学习如何将文本在标签内自动换行、添加一个图像到标签以及增加视觉效果。
下图显示了三种标签的常见用法。最左边的是一个带有图表的标签,中间的是一个旋转文本,最右边的是一个自适应标签大小进行换行的标签。
图1 三种标签
创建一个标签
JavaFX API提供了Label类的三个构造函数,用于在应用程序中创建标签:
//一个空标签
Label label1 = new Label();
//一个带文本的标签
Label label2 = new Label("Search");
Image image = new Image(getClass().getResourceAsStream("search-label.png"));
//一个带文本以及图表的标签
Label label3 = new Label("Search", new ImageView(image));
当创建完一个Label之后,我们还可以用下面两个方法进行添加文本或者图形的:
setText(String text)
设置在label上显示的文字setGraphic(Node graphic)
设置图形图标
setTextFill
方法可以指定标签中文本的颜色。
接下来我们为刚才创建的label1添加文字和图标以及设置文字颜色
Image image1 = new Image(getClass().getResourceAsStream("label.jpg"));
label1.setGraphic(new ImageView(image1));
label1.setText("Search");
label1.setTextFill(Color.web("#0076a3"));
现在我们便得到了下面这个标签:
图2 带文本和图的标签
当在一个标签中同时定义了文本和图形之后我们可以通过setGraphicTextGap
方法调整文本和图形之间的空隙,另外setTextAlignment
可以在文本处于多行显示的时候调整文本的对其方式。setContentDisplay
方法可以设置文本以及图形在显示上的相对位置,可选的属性有ContentDisplay.类下面的常量LFFT, RIGHT, CENTER, TOP, BOTTOM。
设置字体
观察图1和图2我们发现两个label的字体不一样,因为我们还未给标签设置字体因此是以默认字体大小进行显示的。
通过使用label类中setFont 方法设置标签文本的字体。下面展示了两种不同的设置标签字体的方法,我们将label1的字体大小设置成30,并设置字体名Arial,给label2设置字体大小32,字体名Cambria
//用Font类的构造方法
label1.setFont(new Font("Arial", 30));
//用Font类的font方法
label2.setFont(Font.font("Cambria", 32));
文字换行
创建标签时,有时必须将其放置在小于渲染所需的空间内。 要分解(包装)文本使其适合布局区域,请为setWrapText方法设置true值,如
label3.setText("A label that needs to be wrapped");
label3.setWrapText(true);
假设标签的布局区域不仅受到其宽度的限制,还受到其高度的限制。 当无法呈现整个所需的文本字符串时,可以指定标签的行为,比如在某个位置用…表示。 使用Labeled类的setTextOverrun方法和可用的OverrunStyle类型之一来定义如何处理文本字符串中无法正确呈现的部分。 有关OverrunStyle类型的更多信息,请参见API文档。
使用效果
尽管label的内容无法呗编辑,但是可以给它添加一些视觉效果。下面的代码就是给label2添加了旋转270°的并且在垂直方向进行移动的效果:
Label label2 = new Label("Values");
label2.setFont(new Font("Cambria", 32));
label2.setRotate(270);
label2.setTranslateY(50);
旋转和平移是JavaFX API中可用的典型转换。 此外,您可以设置一种效果,当用户将鼠标指针悬停在标签上时,该标签会放大(放大)标签。
下面显示的代码片段将缩放效果应用于label3。 在标签上触发MOUSE_ENTERED事件时,将为setScaleX和setScaleY方法将比例因子设置为1.5。 当用户将鼠标光标从标签上移开并且发生MOUSE_EXITED事件时,比例因子设置为1.0,并且标签以其原始大小进行渲染。
label3.setOnMouseExited(e->{
label3.setScaleY(1);
label3.setScaleX(1);
});
label3.setOnMouseEntered( e->{
label3.setScaleY(1.5);
label3.setScaleX(1.5);
});
完整代码
package JavaFX04_Label;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
import java.io.File;
/**
* <h3>helloJavaFx</h3>
* <p></p>
*
* @author : ZhouKun
* @date : 2020-03-13 19:12
**/
public class LabelDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Label Demo");
HBox hBox = new HBox();
//一个空标签
Label label1 = new Label();
Image image1 = new Image(getClass().getResourceAsStream("label.jpg"));
label1.setGraphic(new ImageView(image1));
label1.setText("Search");
label1.setTextFill(Color.web("#0076a3"));
//用Font类的构造方法
label1.setFont(new Font("Arial", 30));
label1.setWrapText(true);
label1.setGraphicTextGap(10);
//一个带文本的标签
Label label2 = new Label("Values");
//用Font类的font方法
label2.setFont(Font.font("Cambria", 32));
label2.setRotate(270);
label2.setTranslateY(50);
//一个带文本以及图表的标签
Label label3 = new Label("Search");
label3.setText("A label that needs to be wrapped");
label3.setTranslateY(50);
label3.setWrapText(true);
label3.setOnMouseExited(e->{
label3.setScaleY(1);
label3.setScaleX(1);
});
label3.setOnMouseEntered( e->{
label3.setScaleY(1.5);
label3.setScaleX(1.5);
});
hBox.getChildren().addAll(label1, label2, label3);
Scene scene = new Scene(hBox, 500, 180);
primaryStage.setScene(scene);
primaryStage.show();
}
}