第六章 JavaFx控件与布局

来源:互联网 发布:汪道文女学生天涯知乎 编辑:程序博客网 时间:2024/06/17 19:16

参考书籍:《Apress JavaFX.2.0 Introduction by Example Dec 2011》

对话框代码:

package control;import javafx.animation.Animation;import javafx.animation.KeyFrame;import javafx.animation.Timeline;import javafx.application.Application;import javafx.application.Platform;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.geometry.HPos;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.Menu;import javafx.scene.control.MenuBar;import javafx.scene.control.MenuItem;import javafx.scene.control.PasswordField;import javafx.scene.control.RadioMenuItem;import javafx.scene.control.RadioMenuItemBuilder;import javafx.scene.control.SeparatorMenuItem;import javafx.scene.control.TextField;import javafx.scene.control.ToggleGroup;import javafx.scene.input.KeyCode;import javafx.scene.input.KeyCodeCombination;import javafx.scene.input.KeyCombination;import javafx.scene.layout.GridPane;import javafx.scene.paint.Color;import javafx.scene.paint.CycleMethod;import javafx.scene.paint.RadialGradient;import javafx.scene.paint.Stop;import javafx.scene.shape.Circle;import javafx.stage.Modality;import javafx.stage.Stage;import javafx.util.Duration;public class DialogTest extends Application {static Stage LOGIN_DIALOG;static int dx = 1;static int dy = 1;private static Stage createLoginDialog(Stage parent, boolean modal) {if (LOGIN_DIALOG != null) {LOGIN_DIALOG.close();}return new MyDialog(parent, modal, "Welcome to JavaFX!");}@Overridepublic void start(final Stage stage) throws Exception {stage.setTitle("Tabs Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);MenuBar menuBar = new MenuBar();menuBar.prefWidthProperty().bind(stage.widthProperty());Menu menu = new Menu("Home");//打开修改密码提示框MenuItem newItem = new MenuItem("Change Password", null);newItem.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {if (LOGIN_DIALOG == null) {LOGIN_DIALOG = createLoginDialog(stage, true);}LOGIN_DIALOG.sizeToScene();LOGIN_DIALOG.show();}});menu.getItems().add(newItem);menu.getItems().add(new SeparatorMenuItem());//非模态窗体ToggleGroup modalGroup = new ToggleGroup();RadioMenuItem nonModalItem = RadioMenuItemBuilder.create().toggleGroup(modalGroup).text("Non Modal").selected(true).build();nonModalItem.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {LOGIN_DIALOG = createLoginDialog(stage, false);}});menu.getItems().add(nonModalItem);//模态窗体RadioMenuItem modalItem = RadioMenuItemBuilder.create().toggleGroup(modalGroup).text("Modal").selected(true).build();modalItem.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {LOGIN_DIALOG = createLoginDialog(stage, true);}});menu.getItems().add(modalItem);menu.getItems().add(new SeparatorMenuItem());//退出MenuItem exitItem = new MenuItem("Exit", null);exitItem.setMnemonicParsing(true);exitItem.setAccelerator(new KeyCodeCombination(KeyCode.X,KeyCombination.CONTROL_DOWN));exitItem.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {Platform.exit();}});menu.getItems().add(exitItem);menuBar.getMenus().add(menu);group.getChildren().add(menuBar);stage.setScene(scene);stage.show();//运行的球体//addBouncyBall(scene);}//private void addBouncyBall(final Scene scene) {//final Circle ball = new Circle(100, 100, 20);//RadialGradient gradient1 = new RadialGradient(0, .1, 100, 100, 20,//false, CycleMethod.NO_CYCLE, new Stop(0, Color.RED), new Stop(//1, Color.BLACK));//ball.setFill(gradient1);//final Group root = (Group) scene.getRoot();//root.getChildren().add(ball);//Timeline tl = new Timeline();//tl.setCycleCount(Animation.INDEFINITE);//KeyFrame moveBall = new KeyFrame(Duration.seconds(.0200),//new EventHandler<ActionEvent>() {//public void handle(ActionEvent event) {//double xMin = ball.getBoundsInParent().getMinX();//double yMin = ball.getBoundsInParent().getMinY();//double xMax = ball.getBoundsInParent().getMaxX();//double yMax = ball.getBoundsInParent().getMaxY();//// Collision - boundaries//if (xMin < 0 || xMax > scene.getWidth()) {//dx = dx * -1;//}//if (yMin < 0 || yMax > scene.getHeight()) {//dy = dy * -1;//}//ball.setTranslateX(ball.getTranslateX() + dx);//ball.setTranslateY(ball.getTranslateY() + dy);//}//});//tl.getKeyFrames().add(moveBall);//tl.play();//}/** * @param args */public static void main(String[] args) {launch(args);}}class MyDialog extends Stage {public MyDialog(Stage owner, boolean modality, String title) {super();initOwner(owner);Modality m = modality ? Modality.APPLICATION_MODAL : Modality.NONE;initModality(m);setOpacity(.90);setTitle(title);Group root = new Group();Scene scene = new Scene(root, 250, 150, Color.WHITE);setScene(scene);GridPane gridpane = new GridPane();gridpane.setPadding(new Insets(5));gridpane.setHgap(5);gridpane.setVgap(5);Label mainLabel = new Label("Enter User Name & Password");gridpane.add(mainLabel, 1, 0, 2, 1);Label userNameLbl = new Label("User Name: ");gridpane.add(userNameLbl, 0, 1);Label passwordLbl = new Label("Password: ");gridpane.add(passwordLbl, 0, 2);// username text fieldfinal TextField userNameFld = new TextField("Admin");gridpane.add(userNameFld, 1, 1);// password fieldfinal PasswordField passwordFld = new PasswordField();passwordFld.setText("drowssap");gridpane.add(passwordFld, 1, 2);Button login = new Button("Change");login.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {close();}});gridpane.add(login, 1, 3);GridPane.setHalignment(login, HPos.RIGHT);root.getChildren().add(gridpane);}}


对话框运行结果:


CSS设置边框代码:

package control;import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.TextArea;import javafx.scene.layout.GridPane;import javafx.scene.layout.HBox;import javafx.scene.paint.Color;import javafx.stage.Stage;public class GeneratingBordersTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Generating Borders Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);GridPane gridPane = new GridPane();//内边距gridPane.setPadding(new Insets(6));//横向间隔gridPane.setHgap(10);//纵向间隔gridPane.setVgap(10);final TextArea textArea = new TextArea();textArea.setPrefWidth(200);Button button = new Button("应用");gridPane.add(textArea, 0, 0);gridPane.add(button, 0, 1);//默认样式String cssDefault = "-fx-border-color: blue;\n"+ "-fx-border-insets: 5;\n"+ "-fx-border-width: 3;\n"+ "-fx-border-style: dashed;\n";textArea.setText(cssDefault);final HBox hBox = new HBox();hBox.setPrefWidth(100);hBox.setPrefHeight(100);hBox.setStyle(cssDefault);gridPane.add(hBox, 1, 0);//应用修改样式button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {hBox.setStyle(textArea.getText());}});group.getChildren().add(gridPane);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


CSS设置边框运行结果:


GridPane布局使用代码:

package control;import javafx.application.Application;import javafx.geometry.HPos;import javafx.geometry.Insets;import javafx.geometry.Pos;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.PasswordField;import javafx.scene.control.TextField;import javafx.scene.layout.GridPane;import javafx.scene.paint.Color;import javafx.stage.Stage;public class GridLayoutPaneTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Grid Layout Pane Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);GridPane gridPane = new GridPane();//内边距gridPane.setPadding(new Insets(10));//横向间隔gridPane.setHgap(10);//纵向间隔gridPane.setVgap(10);Label usernameLabel = new Label("用户名:");TextField usernameField = new TextField();Label passwordLabel = new Label("密码:");PasswordField passwordField = new PasswordField();Button button = new Button("保存");gridPane.add(usernameLabel, 0, 0);gridPane.add(usernameField, 1, 0);gridPane.add(passwordLabel, 0, 1);gridPane.add(passwordField, 1, 1);GridPane.setHalignment(button, HPos.RIGHT);//横向居右显示gridPane.add(button, 1, 2);//第二列,第三行group.getChildren().add(gridPane);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


GridPane布局运行结果:


快捷键使用代码:

package control;import javafx.application.Application;import javafx.beans.property.SimpleStringProperty;import javafx.beans.property.StringProperty;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Menu;import javafx.scene.control.MenuBar;import javafx.scene.control.MenuItem;import javafx.scene.control.MenuItemBuilder;import javafx.scene.control.SeparatorMenuItem;import javafx.scene.effect.InnerShadow;import javafx.scene.effect.InnerShadowBuilder;import javafx.scene.input.KeyCode;import javafx.scene.input.KeyCodeCombination;import javafx.scene.input.KeyCombination;import javafx.scene.paint.Color;import javafx.scene.text.Font;import javafx.scene.text.FontWeight;import javafx.scene.text.Text;import javafx.scene.text.TextBuilder;import javafx.stage.Stage;public class KeyboardSeqTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Keyboard Seq Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);final StringProperty statusProperty = new SimpleStringProperty();InnerShadow iShadow = InnerShadowBuilder.create().offsetX(3.5f).offsetY(3.5f).build();final Text status = TextBuilder.create().effect(iShadow).x(100).y(50).fill(Color.LIME).font(Font.font(null, FontWeight.BOLD, 35)).translateY(50).build();status.textProperty().bind(statusProperty);statusProperty.set("Keyboard Shortcuts \nCtrl-N, \nCtrl-S, \nCtrl-X");group.getChildren().add(status);MenuBar menuBar = new MenuBar();menuBar.prefWidthProperty().bind(stage.widthProperty());group.getChildren().add(menuBar);Menu menu = new Menu("File");menuBar.getMenus().add(menu);MenuItem newItem = MenuItemBuilder.create().text("New").accelerator(new KeyCodeCombination(KeyCode.N,KeyCombination.CONTROL_DOWN)).onAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {statusProperty.set("Ctrl-N");}}).build();menu.getItems().add(newItem);MenuItem saveItem = MenuItemBuilder.create().text("Save").accelerator(new KeyCodeCombination(KeyCode.S,KeyCombination.CONTROL_DOWN)).onAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {statusProperty.set("Ctrl-S");}}).build();menu.getItems().add(saveItem);menu.getItems().add(new SeparatorMenuItem());MenuItem exitItem = MenuItemBuilder.create().text("Exit").accelerator(new KeyCodeCombination(KeyCode.X,KeyCombination.CONTROL_DOWN)).onAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {statusProperty.set("Ctrl-X");}}).build();menu.getItems().add(exitItem);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


快捷键运行结果:



菜单设置运行代码:

package control;import javafx.application.Application;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.CheckMenuItem;import javafx.scene.control.CheckMenuItemBuilder;import javafx.scene.control.Menu;import javafx.scene.control.MenuBar;import javafx.scene.control.MenuItem;import javafx.scene.control.RadioMenuItem;import javafx.scene.control.RadioMenuItemBuilder;import javafx.scene.control.SeparatorMenuItem;import javafx.scene.control.ToggleGroup;import javafx.scene.paint.Color;import javafx.stage.Stage;public class MenuTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Menu Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);// 创建菜单栏MenuBar menuBar = new MenuBar();// 创建菜单Menu menu = new Menu("File");// 创建菜单项menu.getItems().add(new MenuItem("New"));menu.getItems().add(new MenuItem("Save"));menu.getItems().add(new SeparatorMenuItem());menu.getItems().add(new MenuItem("Exit"));menuBar.getMenus().add(menu);// 创建可选中的菜单项Menu tools = new Menu("Cameras");tools.getItems().add(CheckMenuItemBuilder.create().text("Show Camera 1").selected(true).build());tools.getItems().add(CheckMenuItemBuilder.create().text("Show Camera 2").selected(false).build());menuBar.getMenus().add(tools);//两个菜单项同时只能选中一个Menu alarm = new Menu("Alarm");ToggleGroup tGroup = new ToggleGroup();RadioMenuItem soundAlarmItem = RadioMenuItemBuilder.create().toggleGroup(tGroup).text("Sound Alarm").build();RadioMenuItem stopAlarmItem = RadioMenuItemBuilder.create().toggleGroup(tGroup).text("Alarm Off").selected(true).build();alarm.getItems().add(soundAlarmItem);alarm.getItems().add(stopAlarmItem);//子菜单项Menu contingencyPlans = new Menu("Contingent Plans");contingencyPlans.getItems().add(new CheckMenuItem("Self Destruct in T minus 50"));contingencyPlans.getItems().add(new CheckMenuItem("Turn off the coffee machine "));contingencyPlans.getItems().add(new CheckMenuItem("Run for your lives! "));alarm.getItems().add(contingencyPlans);menuBar.getMenus().add(alarm);group.getChildren().add(menuBar);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


菜单设置运行结果:



多选列表代码:

package control;import javafx.application.Application;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.geometry.HPos;import javafx.geometry.Insets;import javafx.geometry.VPos;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.ListView;import javafx.scene.layout.GridPane;import javafx.scene.layout.VBox;import javafx.scene.paint.Color;import javafx.stage.Stage;public class ObservableListTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Observable List Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);GridPane gridpane = new GridPane();gridpane.setPadding(new Insets(5));gridpane.setHgap(10);gridpane.setVgap(10);Label allLabel = new Label("所有");GridPane.setHalignment(allLabel, HPos.CENTER);gridpane.add(allLabel, 0, 0);Label selectedLabel = new Label("选中");gridpane.add(selectedLabel, 2, 0);GridPane.setHalignment(selectedLabel, HPos.CENTER);//所有国家final ObservableList<String> conturyList = FXCollections.observableArrayList("中国","朝鲜","韩国","日本","美国");final ListView<String> conturyListView = new ListView<String>(conturyList);conturyListView.setPrefWidth(150);conturyListView.setPrefHeight(150);gridpane.add(conturyListView, 0, 1);//选中国家final ObservableList<String> selectConturyList = FXCollections.observableArrayList();final ListView<String> selectConturyListView = new ListView<String>(selectConturyList);selectConturyListView.setPrefWidth(150);selectConturyListView.setPrefHeight(150);gridpane.add(selectConturyListView, 2, 1);Button sendRightButton = new Button(">");sendRightButton.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {String selectedContury = conturyListView.getSelectionModel().getSelectedItem();if (selectedContury != null) {conturyListView.getSelectionModel().clearSelection();conturyList.remove(selectedContury);selectConturyList.add(selectedContury);}}});Button sendLeftButton = new Button("<");sendLeftButton.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {String notSelectContury = selectConturyListView.getSelectionModel().getSelectedItem();if (notSelectContury != null) {selectConturyListView.getSelectionModel().clearSelection();selectConturyList.remove(notSelectContury);conturyList.add(notSelectContury);}}});VBox vbox = new VBox(5);vbox.getChildren().addAll(sendRightButton, sendLeftButton);gridpane.add(vbox, 1, 1);GridPane.setConstraints(vbox, 1, 1, 1, 2, HPos.CENTER, VPos.CENTER);group.getChildren().add(gridpane);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


多选列表结果:


进度条代码:

package control;import java.util.Random;import javafx.application.Application;import javafx.beans.value.ChangeListener;import javafx.beans.value.ObservableValue;import javafx.concurrent.Task;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.geometry.Pos;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.ProgressBar;import javafx.scene.control.ProgressIndicator;import javafx.scene.control.TextArea;import javafx.scene.layout.BorderPane;import javafx.scene.layout.HBox;import javafx.scene.paint.Color;import javafx.stage.Stage;public class ProgressBarTest extends Application {static Task copyWorker;final int numFiles = 30;@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Progress Bar Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);BorderPane mainPane = new BorderPane();mainPane.layoutXProperty().bind(scene.widthProperty().subtract(mainPane.widthProperty()).divide(2));group.getChildren().add(mainPane);final Label label = new Label("文件传输:");final ProgressBar progressBar = new ProgressBar(0);final ProgressIndicator progressIndicator = new ProgressIndicator(0);final HBox hb = new HBox();hb.setSpacing(5);hb.setAlignment(Pos.CENTER);hb.getChildren().addAll(label, progressBar, progressIndicator);mainPane.setTop(hb);final Button startButton = new Button("开始");final Button cancelButton = new Button("结束");final TextArea textArea = new TextArea();textArea.setEditable(false);textArea.setPrefSize(200, 70);final HBox hb2 = new HBox();hb2.setSpacing(5);hb2.setAlignment(Pos.CENTER);hb2.getChildren().addAll(startButton, cancelButton, textArea);mainPane.setBottom(hb2);//点击开始按钮startButton.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {startButton.setDisable(true);progressBar.setProgress(0);progressIndicator.setProgress(0);textArea.setText("");cancelButton.setDisable(false);copyWorker = createWorker(numFiles);progressBar.progressProperty().unbind();progressBar.progressProperty().bind(copyWorker.progressProperty());progressIndicator.progressProperty().unbind();progressIndicator.progressProperty().bind(copyWorker.progressProperty());copyWorker.messageProperty().addListener(new ChangeListener<String>() {public void changed(ObservableValue<? extends String> observable,String oldValue, String newValue) {textArea.appendText(newValue + "\n");}});new Thread(copyWorker).start();}});//点击取消按钮cancelButton.setOnAction(new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {startButton.setDisable(false);cancelButton.setDisable(true);copyWorker.cancel(true);progressBar.progressProperty().unbind();progressBar.setProgress(0);progressIndicator.progressProperty().unbind();progressIndicator.setProgress(0);textArea.appendText("文件传输取消");}});stage.setScene(scene);stage.show();}public Task createWorker(final int numFiles) {return new Task() {@Overrideprotected Object call() throws Exception {for (int i = 0; i < numFiles; i++) {long elapsedTime = System.currentTimeMillis();copyFile("源文件", "目标文件");elapsedTime = System.currentTimeMillis() - elapsedTime;String status = elapsedTime + " milliseconds";updateMessage(status);updateProgress(i + 1, numFiles);}return true;}};}public void copyFile(String src, String dest) throws InterruptedException {Random rnd = new Random(System.currentTimeMillis());long millis = rnd.nextInt(1000);Thread.sleep(millis);}/** * @param args */public static void main(String[] args) {launch(args);}}


进度条运行结果:



分隔栏代码:

package control;import javafx.application.Application;import javafx.collections.ObservableList;import javafx.geometry.Orientation;import javafx.geometry.Pos;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.SplitPane;import javafx.scene.effect.InnerShadow;import javafx.scene.effect.InnerShadowBuilder;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.scene.paint.Color;import javafx.scene.text.Font;import javafx.scene.text.FontWeight;import javafx.scene.text.Text;import javafx.scene.text.TextBuilder;import javafx.stage.Stage;public class SplitTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Split Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);//左侧和右侧分隔块SplitPane splitPane = new SplitPane();splitPane.prefWidthProperty().bind(scene.widthProperty());splitPane.prefHeightProperty().bind(scene.heightProperty());VBox leftArea = new VBox(10);for (int i = 0; i < 5; i++) {HBox rowBox = new HBox(20);final Text leftText = TextBuilder.create().text("Left " + i).translateX(20).fill(Color.BLUE).font(Font.font(null, FontWeight.BOLD, 20)).build();rowBox.getChildren().add(leftText);leftArea.getChildren().add(rowBox);}leftArea.setAlignment(Pos.CENTER);//上侧和下侧分隔块SplitPane splitPane2 = new SplitPane();splitPane2.setOrientation(Orientation.VERTICAL);splitPane2.prefWidthProperty().bind(scene.widthProperty());splitPane2.prefHeightProperty().bind(scene.heightProperty());HBox centerArea = new HBox();InnerShadow iShadow = InnerShadowBuilder.create().offsetX(3.5f).offsetY(3.5f).build();final Text upperRight = TextBuilder.create().text("Upper Right").x(100).y(50).effect(iShadow).fill(Color.LIME).font(Font.font(null, FontWeight.BOLD, 35)).translateY(50).build();centerArea.getChildren().add(upperRight);HBox rightArea = new HBox();final Text lowerRight = TextBuilder.create().text("Lower Right").x(100).y(50).effect(iShadow).fill(Color.RED).font(Font.font(null, FontWeight.BOLD, 35)).translateY(50).build();rightArea.getChildren().add(lowerRight);splitPane2.getItems().add(centerArea);splitPane2.getItems().add(rightArea);//新增左侧区域splitPane.getItems().add(leftArea);//新增右侧区域splitPane.getItems().add(splitPane2);//均匀位置分隔ObservableList<SplitPane.Divider> dividers = splitPane.getDividers();for (int i = 0; i < dividers.size(); i++) {dividers.get(i).setPosition((i + 1.0) / 3);}HBox hbox = new HBox();hbox.getChildren().add(splitPane);group.getChildren().add(hbox);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}}


分隔栏运行结果:



表格代码:

package control;import javafx.application.Application;import javafx.beans.value.ChangeListener;import javafx.beans.value.ObservableValue;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.geometry.HPos;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Label;import javafx.scene.control.ListCell;import javafx.scene.control.ListView;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.Tooltip;import javafx.scene.control.cell.PropertyValueFactory;import javafx.scene.layout.GridPane;import javafx.scene.paint.Color;import javafx.stage.Stage;import javafx.util.Callback;public class TableTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Table Test!");Group group = new Group();Scene scene = new Scene(group, 600, 400, Color.WHITE);GridPane gridpane = new GridPane();gridpane.setPadding(new Insets(5));gridpane.setHgap(10);gridpane.setVgap(10);Label candidatesLbl = new Label("经理");GridPane.setHalignment(candidatesLbl, HPos.CENTER);gridpane.add(candidatesLbl, 0, 0);ObservableList<Person> leaders = getPeople();final ListView<Person> leaderListView = new ListView<>(leaders);leaderListView.setPrefWidth(150);leaderListView.setPrefHeight(150);leaderListView.setCellFactory(new Callback<ListView<Person>, ListCell<Person>>() {public ListCell<Person> call(ListView<Person> param) {final Label leadLbl = new Label();final Tooltip tooltip = new Tooltip();final ListCell<Person> cell = new ListCell<Person>() {@Overridepublic void updateItem(Person item, boolean empty) {super.updateItem(item, empty);if (item != null) {leadLbl.setText(item.getAliasName());setText(item.getFirstName() + " "+ item.getLastName());tooltip.setText(item.getAliasName());setTooltip(tooltip);}}}; return cell;}}); gridpane.add(leaderListView, 0, 1);Label emplLbl = new Label("雇员");gridpane.add(emplLbl, 2, 0);GridPane.setHalignment(emplLbl, HPos.CENTER);final TableView<Person> employeeTableView = new TableView<>();employeeTableView.setPrefWidth(300);final ObservableList<Person> teamMembers = FXCollections.observableArrayList();employeeTableView.setItems(teamMembers);TableColumn<Person, String> aliasNameCol = new TableColumn<>("别名");aliasNameCol.setEditable(true);aliasNameCol.setCellValueFactory(new PropertyValueFactory("aliasName"));aliasNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3);TableColumn<Person, String> firstNameCol = new TableColumn<>("名");firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));firstNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3);TableColumn<Person, String> lastNameCol = new TableColumn<>("姓");lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));lastNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3);employeeTableView.getColumns().setAll(aliasNameCol, firstNameCol,lastNameCol);gridpane.add(employeeTableView, 2, 1);leaderListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Person>() {public void changed(ObservableValue<? extends Person> observable,Person oldValue, Person newValue) {if (observable != null && observable.getValue() != null) {teamMembers.clear();teamMembers.addAll(observable.getValue().employeesProperty());}}});group.getChildren().add(gridpane);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}private ObservableList<Person> getPeople() {ObservableList<Person> people = FXCollections.<Person> observableArrayList();Person docX = new Person("Professor X", "Charles", "Xavier");docX.employeesProperty().add(new Person("Wolverine", "James", "Howlett"));docX.employeesProperty().add(new Person("Cyclops", "Scott", "Summers"));docX.employeesProperty().add(new Person("Storm", "Ororo", "Munroe"));Person magneto = new Person("Magneto", "Max", "Eisenhardt");magneto.employeesProperty().add(new Person("Juggernaut", "Cain", "Marko"));magneto.employeesProperty().add(new Person("Mystique", "Raven", "Darkholme"));magneto.employeesProperty().add(new Person("Sabretooth", "Victor", "Creed"));Person biker = new Person("Mountain Biker", "Jonathan", "Gennick");biker.employeesProperty().add(new Person("Josh", "Joshua", "Juneau"));biker.employeesProperty().add(new Person("Freddy", "Freddy", "Guime"));biker.employeesProperty().add(new Person("Mark", "Mark", "Beaty"));biker.employeesProperty().add(new Person("John", "John", "O'Conner"));biker.employeesProperty().add(new Person("D-Man", "Carl", "Dea"));people.add(docX);people.add(magneto);people.add(biker);return people;}}

package control;import javafx.beans.property.SimpleStringProperty;import javafx.beans.property.StringProperty;import javafx.collections.FXCollections;import javafx.collections.ObservableList;public class Person {private StringProperty aliasName;private StringProperty firstName;private StringProperty lastName;private ObservableList<Person> employees = FXCollections.observableArrayList();public final void setAliasName(String value) {aliasNameProperty().set(value);}public final String getAliasName() {return aliasNameProperty().get();}public StringProperty aliasNameProperty() {if (aliasName == null) {aliasName = new SimpleStringProperty();}return aliasName;}public final void setFirstName(String value) {firstNameProperty().set(value);}public final String getFirstName() {return firstNameProperty().get();}public StringProperty firstNameProperty() {if (firstName == null) {firstName = new SimpleStringProperty();}return firstName;}public final void setLastName(String value) {lastNameProperty().set(value);}public final String getLastName() {return lastNameProperty().get();}public StringProperty lastNameProperty() {if (lastName == null) {lastName = new SimpleStringProperty();}return lastName;}public ObservableList<Person> employeesProperty() {return employees;}public Person(String alias, String firstName, String lastName) {setAliasName(alias);setFirstName(firstName);setLastName(lastName);}}


表格运行结果:



多标签运行代码:

package control;import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.geometry.Pos;import javafx.geometry.Side;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Label;import javafx.scene.control.Menu;import javafx.scene.control.MenuBar;import javafx.scene.control.MenuItem;import javafx.scene.control.Tab;import javafx.scene.control.TabPane;import javafx.scene.layout.BorderPane;import javafx.scene.layout.HBox;import javafx.scene.paint.Color;import javafx.stage.Stage;public class TabsTest extends Application {@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("Tabs Test!");Group group = new Group();Scene scene = new Scene(group, 400, 400, Color.WHITE);TabPane tabPane = new TabPane();MenuBar menuBar = new MenuBar();EventHandler<ActionEvent> action = changeTabPlacement(tabPane);Menu menu = new Menu("标签位置");MenuItem left = new MenuItem("左");left.setOnAction(action);menu.getItems().add(left);MenuItem right = new MenuItem("右");right.setOnAction(action);menu.getItems().add(right);MenuItem top = new MenuItem("上");top.setOnAction(action);menu.getItems().add(top);MenuItem bottom = new MenuItem("下");bottom.setOnAction(action);menu.getItems().add(bottom);menuBar.getMenus().add(menu);BorderPane borderPane = new BorderPane();// 创建10个标签页for (int i = 0; i < 10; i++) {Tab tab = new Tab();tab.setText("标签:" + i);HBox hbox = new HBox();hbox.getChildren().add(new Label("标签:" + i));hbox.setAlignment(Pos.CENTER);tab.setContent(hbox);tabPane.getTabs().add(tab);}borderPane.setCenter(tabPane);borderPane.prefHeightProperty().bind(scene.heightProperty());borderPane.prefWidthProperty().bind(scene.widthProperty());borderPane.setTop(menuBar);group.getChildren().add(borderPane);stage.setScene(scene);stage.show();}/** * @param args */public static void main(String[] args) {launch(args);}private EventHandler<ActionEvent> changeTabPlacement(final TabPane tabPane) {return new EventHandler<ActionEvent>() {public void handle(ActionEvent event) {MenuItem mItem = (MenuItem) event.getSource();String side = mItem.getText();if ("左".equalsIgnoreCase(side)) {tabPane.setSide(Side.LEFT);} else if ("右".equalsIgnoreCase(side)) {tabPane.setSide(Side.RIGHT);} else if ("上".equalsIgnoreCase(side)) {tabPane.setSide(Side.TOP);} else if ("下".equalsIgnoreCase(side)) {tabPane.setSide(Side.BOTTOM);}}};}}


多标签运行结果: