JavaFX 区域与窗格

Sheeraz Gul 2023年1月30日 2022年7月18日
  1. JavaFX 区域
  2. JavaFX 窗格
  3. JavaFX 区域与窗格
JavaFX 区域与窗格

Region 和 Pane 用于将可调整大小的子节点调整到它们的首选大小,而不是重新定位它们。本教程演示了 JavaFX 中 RegionPane 之间的区别。

JavaFX 区域

JavaFX Region 类可用作所有 JavaFX 布局窗格的基类。它提供了一些用于扩展区域的所有 JavaFX 布局类共享的属性。

JavaFX 有许多类是 PaneControlChartAxis 的子类。这四个类和所有其他类是 Region 类的子类;它们都将具有与 Region 相同的属性。

区域属性如下:

  • Background
  • Content Area
  • Padding
  • Borders
  • Margin
  • Region Insets

JavaFX 窗格

JavaFX PaneRegion 的子类。Pane 是一个布局容器,可以包含许多其他 JavaFX 组件来进行布局。

它不提供任何布局算法,但在位置上显示它包含的组件,这对于组件来说是可取的。Pane 使用其子组件指定的 layoutXlayoutY 来确定它们要显示的位置。

Pane 继承了 JavaFX Region 类的所有属性,因为这是一个子类。所以背景、内容区域、填充、边框等也可以用于 Pane

JavaFX 区域与窗格

RegionPane 都用于将可调整大小的子节点调整到其首选大小。他们永远不会重新定位它们。

  • Region 是具有子节点的超类。PaneRegion 类的子类,带有子节点。
  • Region 不允许通过公共 API 操作子节点;另一方面,Pane 将让公共 API 操作子节点。
  • Region.getChildren() 是受保护的,而 Pane.getChildren 不是受保护的方法。
  • Region 专用于组件开发人员;这就是为什么它可以选择允许或不允许 API 用户操纵子系统,如 PaneHbox 等。另一方面,Pane 不提供任何类似的权限; API 用户可以直接操作子节点。

让我们尝试一下 RegionPane 的示例。

区域的示例:

package delftstack;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class JavaFX_Reigon extends Application {
    public void start(Stage Label_Stage) {
        String Label_Text = "DelftStack is a resource for everyone interested in programming.";
        //Create a Label
        Label Demo_Label = new Label(Label_Text);
        //wrap the label
        Demo_Label.setWrapText(true);
        //Set the maximum width of the label
        Demo_Label.setMaxWidth(300);
        //Set the position of the label
        Demo_Label.setTranslateX(30);
        Demo_Label.setTranslateY(30);
        //Create a Region
        Region Label_Root = new Region();
        // Add Children to region which will throw an error
        Label_Root.getChildren().add(Demo_Label);
        //Set the stage
        Scene Label_Scene = new Scene(Label_Root, 595, 150, Color.BEIGE);
        Label_Stage.setTitle("Region Example");
        Label_Stage.setScene(Label_Scene);
        Label_Stage.show();
    }
    public static void main(String args[]){
        launch(args);
    }
}

上面的代码用于将文本包装在标签中。如我们所见,我们将子节点添加到 Region,这是不可能的,所以这段代码应该会抛出错误。

见输出:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
    at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)

让我们为 Pane 尝试相同的示例,我们可以将子节点添加到窗格中。参见示例:

package delftstack;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class JavaFX_Reigon extends Application {
    public void start(Stage Label_Stage) {
        String Label_Text = "DelftStack is a resource for everyone interested in programming.";
        //Create a Label
        Label Demo_Label = new Label(Label_Text);
        //wrap the label
        Demo_Label.setWrapText(true);
        //Set the maximum width of the label
        Demo_Label.setMaxWidth(300);
        //Set the position of the label
        Demo_Label.setTranslateX(30);
        Demo_Label.setTranslateY(30);
        //Create a Pane
        Pane Label_Root = new Pane();
        // Add Children to Pane which will work properly
        Label_Root.getChildren().add(Demo_Label);
        //Set the stage
        Scene Label_Scene = new Scene(Label_Root, 595, 150, Color.BEIGE);
        Label_Stage.setTitle("Pane Example");
        Label_Stage.setScene(Label_Scene);
        Label_Stage.show();
    }
    public static void main(String args[]){
        launch(args);
    }
}

这段代码可以正常工作,因为我们可以将子节点添加到窗格中。见输出:

JavaFX 窗格

Author: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

相关文章 - Java JavaFX