javaFX
UI控件
label标签
用来显示文本的控件
标签分为3中:带有图像的文本元素,旋转的文本,换行的文本。
//空标签
Label label1 = new Label();
//文本标签
Label label2 = new Label("Search");
//带图像的标签
Image image = new Image(getClass().getResourceAsStream("/cai_title.jpg"));
Label label3 = new Label("Search", new ImageView(image));
//设置图片和文本的距离
label3.setGraphicTextGap(15);
//在其布局区域内更改标签内容的位置
label3.setTextAlignment(TextAlignment.JUSTIFY);
//图形相对于文本的位置
label3.setContentDisplay(ContentDisplay.BOTTOM);
//设置字体
label3.setFont(Font.font("Cambria", 32));
// Label label4 = new Label("A label that needs to be wrapped");
//当渲染控件不足显示文本时就会分解(包装)文本
// label4.setWrapText(true);
root.getChildren().add(label3);
//旋转标签
Label label5 = new Label ("Values");
label5.setFont(new Font("Cambria", 32));
label5.setRotate(270);
label5.setTranslateY(50);
//缩放
Label label6 = new Label("A label that needs to be wrapped");
label6.setOnMouseEntered((MouseEvent e) -> {
label6.setScaleX(1.5);
label6.setScaleY(1.5);
});
label6.setOnMouseExited((MouseEvent e) -> {
label6.setScaleX(1);
label6.setScaleY(1);
});
Button按钮
//没有文本的按钮
Button button1 = new Button();
//带文本的按钮
Button button2 = new Button("Accept");
//带图标的按钮
Image imageOk = new Image(getClass().getResourceAsStream("/error.png"));
Button button3 = new Button("Accept", new ImageView(imageOk));
Label label = new Label();
//监听
/*button3.setOnAction((ActionEvent e)-> {
label.setText("Accept");
});*/
DropShadow shadow = new DropShadow();
//鼠标光标打开时添加阴影
button3.addEventHandler(MouseEvent.MOUSE_ENTERED, (MouseEvent e) -> {
button3.setEffect(shadow);
});
//鼠标光标关闭时去除阴影
button3.addEventHandler(MouseEvent.MOUSE_EXITED, (MouseEvent e) -> {
button3.setEffect(null);
});
Radio Button 单选按钮
RadioButton rb1 = new RadioButton();
rb1.setText("Home");
//带图标的单选按钮
Image image = new Image(getClass().getResourceAsStream("/error.png"));
RadioButton rb2 = new RadioButton("Agree");
rb2.setGraphic(new ImageView(image));
//一组单选按钮
final ToggleGroup group = new ToggleGroup();
RadioButton rb3 = new RadioButton("Home");
rb3.setToggleGroup(group);
rb3.setSelected(true); //默认选中
RadioButton rb4 = new RadioButton("Calendar");
rb4.setToggleGroup(group);
RadioButton rb5 = new RadioButton("Contacts");
rb5.setToggleGroup(group);
//事件
group.selectedToggleProperty().addListener((ov, oldToggle, newToggle) -> {
System.out.println(ov.getValue());
});
Toggle Button 切换按钮(与单选按钮类似)
final ToggleGroup group = new ToggleGroup();
ToggleButton tb1 = new ToggleButton("Minor");
tb1.setToggleGroup(group);
tb1.setSelected(true);
ToggleButton tb2 = new ToggleButton("Major");
tb2.setToggleGroup(group);
ToggleButton tb3 = new ToggleButton("Critical");
tb3.setToggleGroup(group);
//事件
group.selectedToggleProperty().addListener((ov, oldToggle, newToggle) -> {
System.out.println(ov.getValue());
});
Checkbox 多选框
final String[] names = new String[]{"Security", "Project", "Chart"};
final Image[] images = new Image[names.length];
final ImageView[] icons = new ImageView[names.length];
final CheckBox[] cbs = new CheckBox[names.length];
for (int i = 0; i < names.length; i++) {
final Image image = images[i] =
new Image(getClass().getResourceAsStream(names[i] + ".png"));
final ImageView icon = icons[i] = new ImageView();
final CheckBox cb = cbs[i] = new CheckBox(names[i]);
cb.selectedProperty().addListener(
(ObservableValue<? extends Boolean> ov,
Boolean old_val, Boolean new_val) -> {
icon.setImage(new_val ? image : null);
});
}
Choice Box 选择框(下拉框)
HBox root = new HBox();
Label label = new Label();
final String[] greetings = new String[]{"1","2","3","4","5"};
final ChoiceBox<String> boxs = new ChoiceBox<>(FXCollections.observableArrayList("1","2","3","4","5"));
boxs.setTooltip(new Tooltip("Select the number"));//设置提示
boxs.getSelectionModel().selectedIndexProperty().addListener((observable,oldValue,newValue) ->{
label.setText(greetings[newValue.intValue()]);
});
root.getChildren().addAll(boxs,label);
Scene scene = new Scene(root, 800, 750);
stage.setScene(scene);
stage.show();
Text Field 文本输入框
Label label1 = new Label("Name:");
TextField textField = new TextField ();
HBox hb = new HBox();
hb.getChildren().addAll(label1, textField);
hb.setSpacing(10);
Password Field 密码框
PasswordField passwordField = new PasswordField();
passwordField.setPromptText("Your password");
Scroll Bar 滚动条
final ScrollBar sc = new ScrollBar();
final Image[] images = new Image[5];
final ImageView[] pics = new ImageView[5];
final VBox vb = new VBox();
DropShadow shadow = new DropShadow();
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root, 180, 180);
scene.setFill(Color.BLACK);
stage.setScene(scene);
stage.setTitle("Scrollbar");
root.getChildren().addAll(vb, sc);
shadow.setColor(Color.GREEN);
shadow.setOffsetX(2);
shadow.setOffsetY(2);
vb.setLayoutX(5);
vb.setSpacing(10);
sc.setLayoutX(scene.getWidth()-sc.getWidth());
sc.setMin(0);
sc.setOrientation(Orientation.VERTICAL);//默认情况下,滚动条水平放置。设置垂直方向
sc.setPrefHeight(180);
sc.setMax(360);
/*
sc.setMin(0); 设置导航栏的最小值
sc.setMax(100); 设置导航栏的最大值
sc.setValue(50); 设置导航栏的初始值
*/
for (int i = 0; i < 5; i++) {
final Image image = images[i] =
new Image(getClass().getResourceAsStream(
"/" + (i+1)+ ".jpg")
);
final ImageView pic = pics[i] =
new ImageView(images[i]);
pic.setEffect(shadow);
vb.getChildren().add(pics[i]);
}
sc.valueProperty().addListener((ObservableValue<? extends Number> ov,
Number old_val, Number new_val) -> {
vb.setLayoutY(-new_val.doubleValue());
});
stage.show();
Scroll Pane 滚动窗格
final ScrollPane sp = new ScrollPane();
final Image[] images = new Image[5];
final ImageView[] pics = new ImageView[5];
final VBox vb = new VBox();
final Label fileName = new Label();
final String [] imageNames = new String [] {"1.jpg", "2.jpg",
"3.jpg", "4.jpg", "5.jpg"};
@Override
public void start(Stage stage) {
VBox box = new VBox();
Scene scene = new Scene(box, 180, 180);
stage.setScene(scene);
stage.setTitle("Scroll Pane");
box.getChildren().addAll(sp, fileName);
VBox.setVgrow(sp, Priority.ALWAYS);
// sp.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
// sp.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);设置滚动窗格的滚动条策略
fileName.setLayoutX(30);
fileName.setLayoutY(160);
for (int i = 0; i < 5; i++) {
images[i] = new Image(getClass().getResourceAsStream("/" + imageNames[i]));
pics[i] = new ImageView(images[i]);
pics[i].setFitWidth(100);
pics[i].setPreserveRatio(true);
vb.getChildren().add(pics[i]);
}
sp.setVmax(440);
sp.setPrefSize(115, 150);
sp.setContent(vb);//定义用作该滚动窗格内容的节点
sp.vvalueProperty().addListener((ObservableValue<? extends Number> ov,
Number old_val, Number new_val) -> {
fileName.setText(imageNames[(new_val.intValue() - 1)/100]);
});
stage.show();
}
List View 列表视图
创建列表视图并设置高宽
ListView<String> list = new ListView<>();
ObservableList<String> items =FXCollections.observableArrayList (
"Single", "Double", "Suite", "Family App");
list.setItems(items);
list.setPrefWidth(100);//设置高宽
list.setPrefHeight(70);
//list.setOrientation(Orientation.HORIZONTAL); 水平展示
ListView
使用SelectionModel
和FocusModel
类跟踪对象的选择和焦点。要获取每个项目的当前状态,请结合使用以下方法:
getSelectionModel().getSelectedIndex()
–以单选模式返回当前所选项目的索引getSelectionModel().getSelectedItem()
–返回当前选择的项目getFocusModel().getFocusedIndex()
–返回当前关注项目的索引getFocusModel().getFocusedItem()
–返回当前关注的项目
public static final ObservableList<String> names =
FXCollections.observableArrayList();
public static final ObservableList<String> data =
FXCollections.observableArrayList();
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("List View Sample");
final ListView<String> listView = new ListView<>(data);
listView.setPrefSize(200, 250);//宽度和高度
listView.setEditable(true);//设置可以编辑
names.addAll(
"Adam", "Alex", "Alfred", "Albert",
"Brenda", "Connie", "Derek", "Donny",
"Lynne", "Myrtle", "Rose", "Rudolph",
"Tony", "Trudy", "Williams", "Zach"
);
for (int i = 0; i < 18; i++) {
data.add("anonym");//初始值
}
listView.setItems(data);
listView.setCellFactory(ComboBoxListCell.forListView(names));//可以选择的值
StackPane root = new StackPane();
root.getChildren().add(listView);
primaryStage.setScene(new Scene(root, 200, 250));
primaryStage.show();
}
ListView<String> list = new ListView<>();
ObservableList<String> data = FXCollections.observableArrayList(
"chocolate", "salmon", "gold", "coral", "darkorchid",
"darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue",
"blueviolet", "brown");
final Label label = new Label();
@Override
public void start(Stage stage) {
VBox box = new VBox();
Scene scene = new Scene(box, 200, 200);
stage.setScene(scene);
stage.setTitle("ListViewSample");
box.getChildren().addAll(list, label);
VBox.setVgrow(list, Priority.ALWAYS);
label.setLayoutX(10);
label.setLayoutY(115);
label.setFont(Font.font("Verdana", 20));
list.setItems(data);
list.setCellFactory((ListView<String> l) -> new ColorRectCell());
list.getSelectionModel().selectedItemProperty().addListener(
(ObservableValue<? extends String> ov, String old_val,
String new_val) -> {
label.setText(new_val);
label.setTextFill(Color.web(new_val));
});
stage.show();
}
static class ColorRectCell extends ListCell<String> {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
Rectangle rect = new Rectangle(100, 20);
if (item != null) {
rect.setFill(Color.web(item));
setGraphic(rect);
} else {
setGraphic(null);
}
}
}
Table View 表格视图
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com")
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn<Person,String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
TableColumn<Person,String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
TableColumn<Person,String> emailCol = new TableColumn<>("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
布局
BorderPane
BorderPane布局面板提供了五个区域,在其中放置节点:上,下,左,右和中心
HBox
HBox布局面板提供了一个单行排列的一系列节点的简单方法
VBox
VBox布局窗格类似于HBox
布局窗格中,不同之处在于节点被布置在单个列中
StackPane
在StackPane布局面板将所有节点与前一个节点的顶部增加每个新节点的单一堆栈中。此布局模型提供了一种将文本覆盖在形状或图像上或将常见形状重叠以创建复杂形状的简便方法
GridPane
GridPane布局面板使您能够创建行并在其中布置节点列的灵活栅格。节点可以放置在网格中的任何单元中,并且可以根据需要跨越单元。网格窗格可用于创建表单或按行和列组织的任何布局
FlowPane
FlowPane布局窗格中的节点连续布置,并环绕在窗格的边界集处。节点可以垂直(按列)或水平(按行)流动。垂直流动窗格环绕在窗格的高度边界处。水平流动窗格环绕窗格的宽度边界
TilePane
TilePane布局窗格将所有节点的网格中,其中每个小区,或瓦,是相同的大小。节点可以水平(按行)或垂直(按列)布局。水平平铺将瓷砖平铺在窗格的宽度边界处,垂直平铺将瓷砖平铺在高度边界处。使用prefColumns
和prefRows
属性来建立图块窗格的首选大小。
可以设置间隙属性来管理行和列之间的间距。可以设置padding属性来管理节点与窗格边缘之间的距离
AnchorPane
AnchorPane布局面板使您能够锚节点的顶部,底部,左侧,右侧或中心窗格。调整窗口大小时,节点将保持其相对于锚点的位置。节点可以锚定到一个以上的位置,并且可以将一个以上节点锚定到同一位置