题目:**16.14(选择一种字体)
编写一个程序,可以动态地改变堆栈面板上显示的标签中文本的字体。这个消息可以同时以粗体和斜体显示。可以从组合框中选择字体名和字体大小,如图16-42a所示。使用Font.getFamilies() 可以得到可用的字体名。字体大小的组合框初始化为从1到100之间的数字。
- 习题思路
- 新建一个String数组size表示组合框中的字体大小,设置为1~100
- 创建一个HBox,创建两个Label和两个组合框ComboBox,第一个组合框内容设置为Font.getFamilies(),第二个组合框内容设置为①中定义的size,两个组合框都要选择一个默认的值作为初始值
- 创建第二个HBox,新建一个Text文本,Font设置成组合框内的默认值
- 创建第三个HBox,创建两个CheckBox复选框,Bold和Italic
- 创建一个BorderPane,将②③④中的HBox分别设置在顶部、中心、底部
- 首先为两个组合框注册事件,当事件被触发时将字体设置为组合框中的值
- 创建一个EventHandler,为两个CheckBox复选框的勾选情况分别对Text设置对应的字体
- 复选框的行为设置为⑦中的EventHandler
- 创建舞台并运行代码
代码示例
编程练习题16_14ChooseAFont.java
java
package chapter_16;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class 编程练习题16_14ChooseAFont extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
String[] size = new String[100];
for(int i = 1;i <= 100;i++) {
size[i-1] = i+"";
}
HBox hBoxTop = new HBox();
ComboBox<String> cboFont = new ComboBox<>();
cboFont.getItems().addAll(Font.getFamilies());
Label lbFont = new Label("Font Name",cboFont);
lbFont.setContentDisplay(ContentDisplay.RIGHT);
cboFont.setValue("华文细黑");
ComboBox<String> cboSize = new ComboBox<>();
cboSize.getItems().addAll(size);
Label lbSize = new Label("Font Size",cboSize);
lbSize.setContentDisplay(ContentDisplay.RIGHT);
cboSize.setValue("26");
hBoxTop.getChildren().addAll(cboFont,lbFont, cboSize,lbSize);
HBox hBoxCenter = new HBox();
hBoxCenter.setAlignment(Pos.CENTER);
Text text = new Text("Programming is fun");
hBoxCenter.getChildren().add(text);
text.setFont(new Font("华文细黑", 26));
HBox hBoxBottom = new HBox();
hBoxBottom.setAlignment(Pos.CENTER);
CheckBox chkBold = new CheckBox("Bold");
CheckBox chkItalic = new CheckBox("Italic");
hBoxBottom.getChildren().addAll(chkBold, chkItalic);
BorderPane borderPane = new BorderPane();
borderPane.setTop(hBoxTop);
borderPane.setCenter(hBoxCenter);
borderPane.setBottom(hBoxBottom);
cboFont.setOnAction(e ->{
Font font = new Font(cboFont.getValue(),Integer.valueOf(cboSize.getValue()));
text.setFont(font);
chkBold.setSelected(false);
chkItalic.setSelected(false);
});
cboSize.setOnAction(e ->{
Font font = new Font(cboFont.getValue(),Integer.valueOf(cboSize.getValue()));
text.setFont(font);
});
EventHandler<ActionEvent> handler = e->{
if(chkBold.isSelected() && chkItalic.isSelected()) {
Font font = Font.font(cboFont.getValue(),FontWeight.BOLD, FontPosture.ITALIC,Integer.valueOf(cboSize.getValue()));
text.setFont(font);
}
else if (chkBold.isSelected()) {
Font font = Font.font(cboFont.getValue(),FontWeight.BOLD, FontPosture.REGULAR,Integer.valueOf(cboSize.getValue()));
text.setFont(font);
}else if(chkItalic.isSelected()) {
Font font = Font.font(cboFont.getValue(),FontWeight.NORMAL, FontPosture.ITALIC,Integer.valueOf(cboSize.getValue()));
text.setFont(font);
}else {
Font font = Font.font(cboFont.getValue(),FontWeight.NORMAL, FontPosture.REGULAR,Integer.valueOf(cboSize.getValue()));
text.setFont(font);
}
};
chkBold.setOnAction(handler);
chkItalic.setOnAction(handler);
Scene scene = new Scene(borderPane,500, 200);
primaryStage.setTitle("编程练习题16_14ChooseAFont");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}