1 內部匿名類和Lambda表達式
2 Switching Scene
3 信息提示框 (Alert Boxes)
前情回顧:
前面的學習內容:關於JavaFX的基本概念,以及窗口所使用的類的一個介紹
學習了如何運用事件對一個按鈕做出最簡單的回應—click me 點擊。
1 內部匿名類和Lambda表達式
在之前的例子上對
button.setOnAction(this);
進行更改
button.setOnAction(new EventHandler<ActionEvent>(){ @Override public void handle(ActionEvent event){ System.out.println("I am an annonymous inner class"); } });
此時點擊按鈕調用的時間就是我們后來修改的,不用去檢驗每個按鈕的名字,直接在生成對象之后對象的方法上調用內部類,使得事件發生。"Click me"。
但是后來會出現一個問題。按照上一次的想法我們有很多個按鈕的時候會寫出if條件結構,然后還要去對應代碼中的對象,但是都使用內部匿名類也不方便。
甲骨文公司在Java 8中開始加入了Lambda表達式,此時將這個語句改成如下:
button.setOnAction(e-> System.out.println("heyyyyy, I am Lambda"));
此時控制台對我們點擊了按鈕進行回應:heyyyyy, I am Lambda,Java自動幫我們處理這個事件。同時也可以改成
button.setOnAction(e->{ System.out.println("heyyyyy, I am Lambda1"); System.out.println("heyyyyy, I am Lambda2"); System.out.println("heyyyyy, I am Lambda3"); });
2 Switching Scene
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; public class Main extends Application{ Stage window; Scene scene1,scene2; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception{ window = primaryStage; Label label1 = new Label("This is Scene1"); Button button1 = new Button("Go to Scene2"); button1.setOnAction(e -> window.setScene(scene2)); //Layout 1 - children are laid out in vertical column VBox layout1 = new VBox(20); layout1.getChildren().addAll(label1,button1); scene1 = new Scene(layout1,200,200); //200x200 pixel //Button2 Button button2 = new Button("Go back to Scene1"); button2.setOnAction(e -> window.setScene(scene1)); //layout2 StackPane layout2 = new StackPane(); layout2.getChildren().addAll(button2); scene2 = new Scene(layout2, 200, 200); window.setScene(scene1); window.setTitle("This is a title"); window.show(); } }
研究Scene1和Scene2 的兩種不同的情況,Scene的切換通過點擊Button來實現。這個例子看起來有點像我們平時使用的軟件,比如說我們要關閉一個word文檔的時候會發現此時,系統彈出一個窗口,問是否保存。有時候系統出錯,也會彈出一個窗口來提示錯誤。下面將介紹具體的例子。
3 信息提示框 (Alert Boxes)
點擊按鍵之后彈出對話框
此時就很像我們實現AlertBox,如果不解決新彈出窗口,比如關閉,那么舊的窗口就不能操作。
public class AlertBox { public static void display(String title, String message){ Stage window = new Stage(); // make a new Stage for our Scene window.initModality(Modality.APPLICATION_MODAL); //initiate the Mod by the using the Java Library window.setTitle(title); //Set the title of the new window window.setMinWidth(250); Label label1 = new Label(); //make label to write some message label1.setText(message); Button closeButton = new Button("Close the window"); closeButton.setOnAction(e ->window.close()); VBox layout = new VBox(10); // make the Alert box layout layout.getChildren().addAll(label1, closeButton); //Add the Button and label to the window layout.setAlignment(Pos.CENTER); Scene scene = new Scene (layout); window.setScene(scene); window.show(); window.showAndWait(); } }
-
showAndWait 官方解釋
public void showAndWait()
Shows this stage and waits for it to be hidden (closed) before returning to the caller. This method temporarily blocks processing of the current event, and starts a nested event loop to handle other events. This method must be called on the FX Application thread.A Stage is hidden (closed) by one of the following means:
- the application calls the
Window.hide()
orclose()
method on this stage - this stage has a non-null owner window, and its owner is closed
- the user closes the window via the window system (for example, by pressing the close button in the window decoration)
- the application calls the