JavaFX - 应用

  • 简述

    在本章中,我们将详细讨论 JavaFX 应用程序的结构,并通过示例学习创建 JavaFX 应用程序。
  • JavaFX 应用程序结构

    通常,JavaFX 应用程序将具有三个主要组件,即 Stage, SceneNodes 如下图所示。
    JavaFX 应用程序结构

    阶段

    Stage (一个窗口)包含 JavaFX 应用程序的所有对象。它由Stage 包的类 javafx.stage. 初级阶段由平台本身创建。创建的 Stage 对象作为参数传递给start() 的方法 Application 类(在下一节中解释)。
    一个 Stage 有两个参数决定它的位置,即 WidthHeight. 它分为内容区和装饰(标题栏和边框)。
    有五种类型的阶段可用 -
    • Decorated
    • Undecorated
    • Transparent
    • Unified
    • Utility
    你必须调用给 show() 显示 Stage 内容的方法。

    Scene

    Scene 表示 JavaFX 应用程序的物理内容。它包含 Scene 图的所有内容。班上Scene 包裹的 javafx.scene表示 Scene 对象。在一个实例中, Scene 对象仅添加到一个阶段。
    您可以通过实例化 Scene 类来创建 Scene 。您可以通过传递其尺寸(高度和宽度)以及root node 到它的构造函数。

    Scene 图和节点

    一种 scene graph是表示 Scene 内容的树状数据结构(分层)。相比之下,一个node 是 Scene 图的视觉/图形对象。
    一个节点可能包括 -
    • 几何(图形)对象(2D 和 3D),例如 - 圆形、矩形、多边形等。
    • UI 控件,例如 - 按钮、复选框、选择框、文本区域等。
    • 容器(布局窗格),例如边框窗格、网格窗格、流窗格等。
    • 媒体元素,例如音频、视频和图像对象。
    Node 包的类别 javafx.scene 代表JavaFX中的一个节点,这个类是所有节点的超类。
    如前所述,节点分为三种类型 -
    • Root Node − 第一个 Scene 图被称为根节点。
    • Branch Node/Parent Node− 带有子节点的节点称为分支/父节点。抽象类名为Parent 包裹的 javafx.scene 是所有父节点的基类,这些父节点将具有以下类型 -
      • Group− 组节点是包含子节点列表的集合节点。每当渲染组节点时,它的所有子节点都会按顺序渲染。应用于组的任何转换、效果状态都将应用于所有子节点。
      • Region − 它是所有基于 JavaFX Node 的 UI 控件的基类,例如 Chart、Pane 和 Control。
      • WebView − 该节点管理网络引擎并显示其内容。
    • Leaf Node− 没有子节点的节点称为叶节点。例如,Rectangle、Ellipse、Box、ImageView、MediaView 都是叶子节点的例子。
    必须将根节点传递给 Scene 图。如果 Group 作为 root 传递,则所有节点都将被裁剪到 Scene 中,并且 Scene 大小的任何更改都不会影响 Scene 的布局。
  • 创建 JavaFX 应用程序

    要创建 JavaFX 应用程序,您需要实例化 Application 类并实现其抽象方法 start(). 在此方法中,我们将为 JavaFX 应用程序编写代码。

    应用类

    Application 包的类别 javafx.application是应用程序在 JavaFX 中的入口点。要创建 JavaFX 应用程序,您需要继承该类并实现其抽象方法start(). 在此方法中,您需要编写 JavaFX 图形的全部代码
    在里面 main 方法,您必须使用 launch()方法。该方法在内部调用start() Application 类的方法,如下面的程序所示。
    
    public class JavafxSample extends Application {  
       @Override     
       public void start(Stage primaryStage) throws Exception { 
          /* 
          Code for JavaFX application. 
          (Stage, scene, scene graph) 
          */       
       }         
       public static void main(String args[]){           
          launch(args);      
       } 
    } 
    
    start() 方法,为了创建典型的 JavaFX 应用程序,您需要按照以下步骤操作 -
    • 准备一个包含所需节点的 Scene 图。
    • 准备一个具有所需尺寸的 Scene 并将 Scene 图( Scene 图的根节点)添加到其中。
    • 准备 Stage 并将 Scene 添加到 Stage 并显示 Stage 内容。

    准备 Scene 图

    根据您的应用程序,您需要准备一个包含所需节点的 Scene 图。由于根节点是第一个节点,所以需要创建一个根节点。作为根节点,您可以选择Group, Region or WebView.
    Group - Group 节点由名为的类表示 Group 属于包 javafx.scene,您可以通过实例化此类来创建一个 Group 节点,如下所示。
    
    Group root = new Group();
    
    getChildren() 的方法 Group 类给你一个对象 ObservableList保存节点的类。我们可以检索此对象并向其添加节点,如下所示。
    
    //Retrieving the observable list object 
    ObservableList list = root.getChildren(); 
           
    //Setting the text object as a node  
    list.add(NodeObject); 
    
    我们还可以将 Node 对象添加到组中,只需将它们传递给 Group 类及其在实例化时的构造函数,如下所示。
    
    Group root = new Group(NodeObject);
    
    Region - 它是所有基于 JavaFX 节点的 UI 控件的基类,例如 -
    • Chart - 该类是所有图表的基类,属于包 javafx.scene.chart.
      这个类有两个子类,它们是 - PieChartXYChart. 这两个依次有子类,例如AreaChart, BarChart, BubbleChart等用于在 JavaFX 中绘制不同类型的 XY-Plane Charts。
      您可以使用这些类在您的应用程序中嵌入图表。
    • Pane − Pane 是所有布局窗格的基类,例如 AnchorPane, BorderPane, DialogPane等。此类属于一个称为 - javafx.scene.layout.
      您可以使用这些类在应用程序中插入预定义的布局。
    • Control - 它是用户界面控件的基类,例如 Accordion, ButtonBar, ChoiceBox, ComboBoxBase, HTMLEditor, etc. This class belongs to the package javafx.scene.control.
      您可以使用这些类在应用程序中插入各种 UI 元素。
    在一个 Group 中,可以实例化上述任何一个类,并将它们用作根节点,如下面的程序所示。
    
    //Creating a Stack Pane 
    StackPane pane = new StackPane();       
           
    //Adding text area to the pane  
    ObservableList list = pane.getChildren(); 
    list.add(NodeObject);
    
    WebView − 该节点管理网络引擎并显示其内容。
    下图表示 JavaFX 的节点类层次结构。
    网页视图

    准备 Scene

    JavaFX Scene 由 Scene 包的类别 javafx.scene. 您可以通过实例化此类来创建 Scene ,如下面的代码块所示。
    在实例化时,必须将根对象传递给 Scene 类的构造函数。
    
    Scene scene = new Scene(root);
    
    您还可以传递两个表示 Scene 高度和宽度的 double 类型的参数,如下所示。
    
    Scene scene = new Scene(root, 600, 300);
    

    准备 Stage

    这是任何 JavaFX 应用程序的容器,它为应用程序提供了一个窗口。它由Stage 包的类别 javafx.stage. 此类的对象作为参数传递start() 的方法 Application 班级。
    使用此对象,您可以在 Stage 上执行各种操作。主要您可以执行以下操作 -
    • 使用方法设置 Stage 的标题 setTitle().
    • 使用 setScene() 方法。
    • 使用 show() 方法如下图。
    
    //Setting the title to Stage. 
    primaryStage.setTitle("Sample application"); 
           
    //Setting the scene to Stage 
    primaryStage.setScene(scene); 
           
    //Displaying the stage 
    primaryStage.show();
    
  • JavaFX 应用程序的生命周期

    JavaFX Application 类具有三个生命周期方法,它们是 -
    • start() - 要编写 JavaFX 图形代码的入口点方法。
    • stop() - 一个可以被覆盖的空方法,在这里你可以编写停止应用程序的逻辑。
    • init() - 可以覆盖的空方法,但不能在此方法中创建 Stage 或 Scene 。
    除了这些,它还提供了一个名为的静态方法 launch() 启动 JavaFX 应用程序。
    由于 launch()方法是静态的,您需要从静态上下文(通常为 main)调用它。每当启动 JavaFX 应用程序时,将执行以下操作(以相同的顺序)。
    • 应用程序类的一个实例被创建。
    • Init() 方法被调用。
    • start() 方法被调用。
    • 启动器等待应用程序完成并调用 stop() 方法。

    终止 JavaFX 应用程序

    当应用程序的最后一个窗口关闭时,JavaFX 应用程序将隐式终止。您可以通过将布尔值“False”传递给静态方法来关闭此行为 setImplicitExit() (应该从静态上下文中调用)。
    您可以使用以下方法显式终止 JavaFX 应用程序 Platform.exit() 或者 System.exit(int)。
  • 示例 1 – 创建一个空窗口

    本节教您如何创建一个显示空窗口的 JavaFX 示例应用程序。以下是步骤 -

    第 1 步:创建一个类

    创建一个Java类并继承 Application 包的类别 javafx.application 并实现该类的 start() 方法如下。
    
    public class JavafxSample extends Application {  
       @Override     
       public void start(Stage primaryStage) throws Exception {      
       }    
    } 
    

    步骤 2:创建组对象

    在里面 start() 方法通过实例化名为 Group 的类来创建一个 group 对象,该类属于包 javafx.scene, 如下。
    
    Group root = new Group();
    

    步骤 3:创建 Scene 对象

    通过实例化名为的类来创建 Scene Scene 属于包 javafx.scene. 向这个类传递 Group 对象(root),在上一步中创建。
    除了根对象,您还可以传递两个表示屏幕高度和宽度的双参数以及 Group 类的对象,如下所示。
    
    Scene scene = new Scene(root,600, 300);
    

    第 4 步:设置 Stage 的标题

    您可以使用 setTitle() 的方法 Stage班级。这primaryStage 是一个 Stage 对象,它作为参数传递给 Scene 类的 start 方法。
    使用 primaryStage 对象,将 Scene 的标题设置为 Sample Application 如下所示。
    
    primaryStage.setTitle("Sample Application");
    

    第 5 步:将 Scene 添加到 Stage

    您可以使用方法将 Scene 对象添加到 Stage setScene() 类名为 Stage. 使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
    
    primaryStage.setScene(scene);
    

    第 6 步:显示 Stage 内容

    使用名为的方法显示 Scene 的内容 show()Stage 类如下。
    
    primaryStage.show();
    

    第 7 步:启动应用程序

    通过调用静态方法启动 JavaFX 应用程序 launch()Application 类从主要方法如下。
    
    public static void main(String args[]){   
       launch(args);      
    }  
    

    例子

    以下程序生成一个空的 JavaFX 窗口。将此代码保存在名称为的文件中JavafxSample.java
    
    import javafx.application.Application; 
    import javafx.scene.Group; 
    import javafx.scene.Scene; 
    import javafx.scene.paint.Color; 
    import javafx.stage.Stage;  
    public class JavafxSample extends Application { 
       @Override     
       public void start(Stage primaryStage) throws Exception {            
          //creating a Group object 
          Group group = new Group(); 
           
          //Creating a Scene by passing the group object, height and width   
          Scene scene = new Scene(group ,600, 300); 
          
          //setting color to the scene 
          scene.setFill(Color.BROWN);  
          
          //Setting the title to Stage. 
          primaryStage.setTitle("Sample Application"); 
       
          //Adding the scene to Stage 
          primaryStage.setScene(scene); 
           
          //Displaying the contents of the stage 
          primaryStage.show(); 
       }    
       public static void main(String args[]){          
          launch(args);     
       }         
    } 
    
    使用以下命令从命令提示符编译并执行保存的 java 文件。
    
    javac JavafxSample.java 
    java JavafxSample
    
    执行时,上述程序会生成一个 JavaFX 窗口,如下所示。
    示例应用程序
  • 示例 2 – 绘制一条直线

    在前面的例子中,我们已经看到了如何创建一个空 Stage ,现在在这个例子中让我们尝试使用 JavaFX 库绘制一条直线。
    以下是步骤 -

    第 1 步:创建一个类

    创建一个Java类并继承 Application 包的类别 javafx.application 并实施 start() 这个类的方法如下。
    
    public class DrawingLine extends Application {
       @Override     
       public void start(Stage primaryStage) throws Exception {     
       }    
    } 
    

    第 2 步:创建一条线

    您可以通过实例化名为的类在 JavaFX 中创建一行 Line 属于一个包 javafx.scene.shape, 实例化这个类如下。
    
    //Creating a line object         
    Line line = new Line();
    

    第 3 步:设置线的属性

    通过设置属性指定在 XY 平面上绘制线的坐标 startX, startY, endXendY,使用它们各自的 setter 方法,如以下代码块所示。
    
    line.setStartX(100.0); 
    line.setStartY(150.0); 
    line.setEndX(500.0); 
    line.setEndY(150.0);
    

    步骤 4:创建组对象

    在 start() 方法中,通过实例化名为 Group 的类来创建一个组对象,该类属于包 javafx.scene。
    将在上一步中创建的 Line(节点)对象作为参数传递给 Group 类的构造函数,以便将其添加到组中,如下所示 -
    
    Group root = new Group(line);
    

    步骤 5:创建 Scene 对象

    通过实例化名为的类来创建 Scene Scene 属于包 javafx.scene. 向这个类传递 Group 对象(root) 这是在上一步中创建的。
    除了根对象,您还可以传递两个表示屏幕高度和宽度的双参数以及 Group 类的对象,如下所示。
    
    Scene scene = new Scene(group ,600, 300);
    

    第 6 步:设置 Stage 的标题

    您可以使用 setTitle() 的方法 Stage班级。这primaryStage 是一个 Stage 对象,它作为参数传递给 Scene 类的 start 方法。
    使用 primaryStage 对象,将 Scene 的标题设置为 Sample Application 如下。
    
    primaryStage.setTitle("Sample Application");
    

    第 7 步:将 Scene 添加到 Stage

    您可以使用方法将 Scene 对象添加到 Stage setScene() 类名为 Stage. 使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
    
    primaryStage.setScene(scene);
    

    步骤 8:显示 Stage 内容

    使用名为的方法显示 Scene 的内容 show()Stage 类如下。
    
    primaryStage.show();
    

    步骤 9:启动应用程序

    通过调用静态方法启动 JavaFX 应用程序 launch()Application 类从主要方法如下。
    
    public static void main(String args[]){   
       launch(args);      
    } 
    

    例子

    以下程序显示了如何使用 JavaFX 生成一条直线。将此代码保存在名称为的文件中JavafxSample.java.
    
    import javafx.application.Application; 
    import javafx.scene.Group; 
    import javafx.scene.Scene; 
    import javafx.scene.shape.Line; 
    import javafx.stage.Stage;  
    public class DrawingLine extends Application{ 
       @Override 
       public void start(Stage stage) { 
          //Creating a line object 
          Line line = new Line(); 
             
          //Setting the properties to a line 
          line.setStartX(100.0); 
          line.setStartY(150.0); 
          line.setEndX(500.0); 
          line.setEndY(150.0); 
             
          //Creating a Group 
          Group root = new Group(line); 
             
          //Creating a Scene 
          Scene scene = new Scene(root, 600, 300); 
             
          //Setting title to the scene 
          stage.setTitle("Sample application"); 
             
          //Adding the scene to the stage 
          stage.setScene(scene); 
             
          //Displaying the contents of a scene 
          stage.show(); 
       }      
       public static void main(String args[]){ 
          launch(args); 
       } 
    } 
    
    使用以下命令从命令提示符编译并执行保存的 java 文件。
    
    javac DrawingLine.java 
    java DrawingLine
    
    执行时,上述程序会生成一个 JavaFX 窗口,显示一条直线,如下所示。
    画线
  • 示例 3 – 显示文本

    我们还可以在 JavaFX Scene 中嵌入文本。此示例显示如何在 JavaFX 中嵌入文本。
    以下是步骤 -

    第 1 步:创建一个类

    创建一个 Java 类并继承 Application 包的类别 javafx.application 并实施 start() 这个类的方法如下。
    
    public class DrawingLine extends Application {  
       @Override     
       public void start(Stage primaryStage) throws Exception {     
       } 
    }
    

    第 2 步:嵌入文本

    您可以通过实例化名为的类将文本嵌入到 JavaFX Scene 中 Text 属于一个包 javafx.scene.shape,实例化这个类。
    您可以通过以字符串格式传递要嵌入的文本来实例化此类,或者,您可以使用默认构造函数创建文本对象,如下所示。
    
    //Creating a Text object 
    Text text = new Text();
    

    第 3 步:设置字体

    您可以使用 setFont() 的方法 Text班级。此方法接受一个字体对象作为参数。将给定文本的字体设置为 45,如下所示。
    
    //Setting font to the text 
    text.setFont(new Font(45)); 
    

    第 4 步:设置文本的位置

    您可以通过使用各自的 setter 方法设置 X、Y 坐标来设置文本在 XY 平面上的位置 setX()setY() 如下。
    
    //setting the position of the text 
    text.setX(50); 
    text.setY(150); 
    

    第五步:设置要添加的文字

    您可以使用 Text 类的 setText() 方法设置要添加的文本。此方法接受表示要添加的文本的字符串参数。
    
    text.setText("Welcome to Tutorialspoint");
    

    步骤 6:创建组对象

    在里面 start() 方法,通过实例化名为Group的类来创建一个group对象,该类属于包 javafx.scene.
    将在上一步中创建的 Text(节点)对象作为参数传递给 Group 类的构造函数,以便将其添加到组中,如下所示 -
    
    Group root = new Group(text)
    

    步骤 7:创建 Scene 对象

    通过实例化名为的类来创建 Scene Scene 属于包 javafx.scene. 向这个类传递 Group 对象(root),在上一步中创建。
    除了根对象,您还可以传递两个表示屏幕高度和宽度的双参数以及 Group 类的对象,如下所示。
    
    Scene scene = new Scene(group ,600, 300);
    

    第八步:设置 Stage 标题

    您可以使用 setTitle() 的方法 Stage班级。这primaryStage 是一个 Stage 对象,它作为参数传递给 Scene 类的 start 方法。
    使用 primaryStage 对象,将 Scene 的标题设置为 Sample Application 如下所示。
    
    primaryStage.setTitle("Sample Application");
    

    第 9 步:将 Scene 添加到 Stage

    您可以使用方法将 Scene 对象添加到 Stage setScene() 类名为 Stage. 使用此方法添加前面步骤中准备的 Scene 对象,如下所示。
    
    primaryStage.setScene(scene);
    

    第 10 步:显示 Stage 内容

    使用名为的方法显示 Scene 的内容 show()Stage 类如下。
    
    primaryStage.show();
    

    第 11 步:启动应用程序

    通过调用静态方法启动 JavaFX 应用程序 launch()Application 类从主要方法如下。
    
    public static void main(String args[]){ 
       launch(args);      
    } 
    

    例子

    以下是使用 JavaFX 显示文本的程序。将此代码保存在具有名称的文件中DisplayingText.java.
    
    import javafx.application.Application; 
    import javafx.collections.ObservableList; 
    import javafx.scene.Group; 
    import javafx.scene.Scene; 
    import javafx.stage.Stage; 
    import javafx.scene.text.Font; 
    import javafx.scene.text.Text; 
             
    public class DisplayingText extends Application { 
       @Override 
       public void start(Stage stage) {       
          //Creating a Text object 
          Text text = new Text(); 
           
          //Setting font to the text 
          text.setFont(new Font(45)); 
           
          //setting the position of the text 
          text.setX(50); 
          text.setY(150);          
          
          //Setting the text to be added. 
          text.setText("Welcome to Tutorialspoint"); 
             
          //Creating a Group object  
          Group root = new Group(); 
           
          //Retrieving the observable list object 
          ObservableList list = root.getChildren(); 
           
          //Setting the text object as a node to the group object 
          list.add(text);       
                   
          //Creating a scene object 
          Scene scene = new Scene(root, 600, 300); 
           
          //Setting title to the Stage 
          stage.setTitle("Sample Application"); 
             
          //Adding scene to the stage 
          stage.setScene(scene); 
             
          //Displaying the contents of the stage 
          stage.show(); 
       }   
       public static void main(String args[]){ 
          launch(args); 
       } 
    } 
    
    使用以下命令从命令提示符编译并执行保存的 java 文件。
    
    javac DisplayingText.java 
    java DisplayingText