生命周期

  • init() - 非UI线程,不能处理UI
  • start() - 开始,处于UI线程(一般情况下,程序只需要重写该生命周期即可
  • stop() - 结束,处于UI线程 ```java public class Main extends Application {

    @Override public void init() throws Exception {

    1. super.init();

    }

  1. @Override
  2. public void start(Stage primaryStage) throws Exception{
  3. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
  4. primaryStage.setTitle("Hello World");
  5. primaryStage.setScene(new Scene(root, 300, 275));
  6. primaryStage.show();
  7. }
  8. @Override
  9. public void stop() throws Exception {
  10. super.stop();
  11. }
  12. public static void main(String[] args) {
  13. launch(args);
  14. }

}

  1. <a name="aV3Pr"></a>
  2. ## 启动窗口及关闭
  3. ```java
  4. @Override
  5. public void start(Stage primaryStage) throws Exception{
  6. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
  7. primaryStage.setScene(new Scene(root, 300, 275));
  8. primaryStage.show();//启动
  9. primaryStage.close();//关闭
  10. }

注:一般情况下,窗口关闭了,且没有其他任务,程序就结束了,如果想要窗口关闭,程序不结束可以设置

  1. Platform.setImplicitExit(false);//在start中设置

注:设置以上方法后,想要退出,可以调用

  1. Platform.exit();

设置窗口大小

  • 最小化及最大化

    1. primaryStage.setIconified(true);//设置最小化
    2. primaryStage.setMaximized(true);//设置最大化
  • 设置全屏

    1. @Override
    2. public void start(Stage primaryStage) throws Exception{
    3. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    4. primaryStage.setFullScreen(true);
    5. primaryStage.setScene(new Scene(root));//root也可以new Group()
    6. primaryStage.show();
    7. }
  • 设置指定大小

    1. @Override
    2. public void start(Stage primaryStage) throws Exception{
    3. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    4. primaryStage.setScene(new Scene(root, 300, 275));
    5. primaryStage.show();
    6. }

    监听窗口大小

  • 获取宽高 ```java primaryStage.show();//需要在show之后才能获取到宽高

//获取宽高 primaryStage.getHeight(); primaryStage.getWidth();

  1. - 监听宽高变化
  2. ```java
  3. //监听宽度实时变化
  4. primaryStage.widthProperty().addListener(new ChangeListener<Number>() {
  5. @Override
  6. public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
  7. System.out.println("当前宽度为:"+newValue.doubleValue());
  8. }
  9. });
  10. primaryStage.heightProperty().addListener(new ChangeListener<Number>() {
  11. @Override
  12. public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
  13. System.out.println("当前高度为:"+newValue.doubleValue());
  14. }
  15. });

设置窗口图标

  1. primaryStage.getIcons().add(new Image("file:E:\\图\\表情包\\猫\\还有这种操作.jpg"));
  2. //这里也可以是网络url,如果是本地文件,需要添加file:的前缀

设置窗口透明度

  1. primaryStage.setOpacity(0.5);

设置窗口强制置顶

  1. primaryStage.setAlwaysOnTop(true);

image.png
相当于该功能。

设置窗口的坐标(左上角的坐标)

  1. primaryStage.setX(0);
  2. primaryStage.setY(0);

注:上例的作用为显示在桌面的左上角

多窗口创建及其启动模式

模式

  1. public class Main2 extends Application {
  2. @Override
  3. public void start(Stage primaryStage) throws Exception {
  4. Stage s1 = new Stage();
  5. s1.setTitle("s1");
  6. //纯白背景和平台装饰
  7. s1.initStyle(StageStyle.DECORATED);
  8. s1.show();
  9. Stage s2 = new Stage();
  10. s2.setTitle("s2");
  11. //透明背景且没有装饰
  12. s2.initStyle(StageStyle.TRANSPARENT);
  13. s2.show();
  14. Stage s3 = new Stage();
  15. s3.setTitle("s3");
  16. //纯白背景,无装饰。
  17. s3.initStyle(StageStyle.UNDECORATED);
  18. s3.show();
  19. Stage s4 = new Stage();
  20. s4.setTitle("s4");
  21. //纯白背景和最少平台装饰
  22. s4.initStyle(StageStyle.UNIFIED);
  23. s4.show();
  24. Stage s5 = new Stage();
  25. s5.setTitle("s5");
  26. //一个统一标准的舞台
  27. s5.initStyle(StageStyle.UTILITY);
  28. s5.show();
  29. // 终止JavaFX应用程序
  30. Platform.exit();
  31. }
  32. public static void main(String[] args) {
  33. launch();
  34. }
  35. }

模态

  1. Stage s3 = new Stage();
  2. //当该窗口在启动时,无法操作该应用的其他窗口,除非先关闭该窗口,
  3. s3.initModality(Modality.APPLICATION_MODAL);
  4. s3.initOwner(s2);
  5. // 阻止事件传递到所有者的窗口
  6. //s3.initModality(Modality.WINDOW_MODAL);
  7. s3.setTitle("s3");
  8. s3.show();

UI线程

  1. @Override
  2. public void start(Stage primaryStage) throws Exception{
  3. new Threath(new Runnable() {
  4. @Override
  5. public void run() {
  6. //切回UI线程更新UI
  7. Platform.runLater(new Runnable() {
  8. @Override
  9. public void run() {
  10. //处于UI线程,不能做耗时任务,更新UI
  11. }
  12. });
  13. }
  14. });).start()
  15. }

检查当前平台是否支持某特性

  1. // 检查是否支持某种特性
  2. System.out.println(Platform.isSupported(ConditionalFeature.SCENE3D))

添加控件

  1. @Override
  2. public void start(Stage primaryStage) throws Exception{
  3. URL url = getClass().getClassLoader().getResource("bin/hello");
  4. System.out.println(url.toExternalForm());
  5. TextArea tv = new TextArea();//文本框
  6. tv.setText("欸哈哈哈哈哈你");
  7. tv.setLayoutX(100);//设置横坐标
  8. Button btn = new Button();
  9. btn.setPrefWidth(100);//按钮的宽
  10. btn.setPrefHeight(50);//按钮的高
  11. Group group = new Group();
  12. // group.getChildren().add(btn);
  13. // group.getChildren().add(tv);
  14. group.getChildren().addAll(tv,btn);
  15. Scene scene = new Scene(group);
  16. scene.setCursor(Cursor.MOVE);//设置鼠标图标类型,可不设置
  17. primaryStage.setScene(scene);
  18. primaryStage.setTitle("标题栏");
  19. primaryStage.show();//启动
  20. }

image.png