JavaFX--第2天-窗口基本的类

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() or close() 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)
时间: 2025-01-15 22:27:36

JavaFX--第2天-窗口基本的类的相关文章

C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一个类. 但是,这个窗口仅仅定义是不能存在于现实中的,它要借助于Application类才能够诞生,才能够开始运行,但是诞生的,不是这个类,而是这个从Form类派生下来的类的一个或者某个实例. 谈到Application类,就不能不提起Program类:因为Application类必须在Program

窗口类型注册类

从前面的窗口程序可以看到,这个程序主要做了三件事情,第一件是注册窗口,第二件是创建窗口,第三件是显示窗口.从程序的代码上,很容易就看出来每个函数是在做什么事情,这典型是基于函数式的编程,行云如流水般.对于小的程序,这样的编程方式是没有什么问题.现在我们来考虑一下如果要注册多个窗口,创建多个窗口和显示多个窗口,再使用这样的函数代码,就比较难复用了.因而随着编程技术发展和软件项目的增大,目前普遍基于面向对象编程,这样可以很方便地构思多个窗口的注册.创建和显示.比如可以把注册窗口封装为一个类,如果要创

C#中程序启动窗口没有注册类

没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) 解决方法: 出现这个问题主要是因为32位操作系统和64位操作系统存在兼容性问题.解决方案: 1.鼠标右击解决方案,点击属性按钮调出属性窗口. 2.点击配置标签,把平台改为X86. 3.如果上图的位置没有X86平台,点击配置管理器,新建一个x86平台. 点击确定,将平台改为x86,重新生成解决方案即可.

Eclipse4.7使用基础 显示Hierarchy窗口 选中一个类按F4 显示类的继承层次

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0) Test类继承HelloWorld类 选中Test类,按F4 窗口出现 Object类是HelloWorld类的父亲,HelloWorld类是Test类的父亲. 在类的继承层次下面的窗口中,你可以看到类中的各种成员.虽然 给最苦现在的境界不够,不经常用这个功能,但是依然可以看出来 这个功能能提供大助力. Java优秀,值得学习.E

在窗口中显示类信息

import java.lang.reflect.Field; import javax.swing.JFrame; import javax.swing.BorderFactory; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JLabel

JavaFX(三)窗口拖动

问题场景: 在上一篇中,我们将窗口的默认标题栏隐藏从而导致鼠标点击窗体无法进行拖动. 思路: 给组件添加鼠标按下事件监听器和鼠标拖动事件监听器. 实现: 代码片段: private double xOffset = 0; private double yOffset = 0; 代码片段: root.setOnMousePressed((MouseEvent event) -> { event.consume(); xOffset = event.getSceneX(); yOffset = ev

通用窗口类 Inventory Pro 2.1.2 Demo1(上)

插件功能 按照Demo1的实现,使用插件来实现一个装备窗口是很easy的,虽然效果还很原始但是也点到为止了,本篇涉及的功能用加粗标出,具体的功能如下: 1.实现了两个窗口,通过点击键盘I来,打开或者关闭窗口也就是Toggle功能 2.装备窗口中的物品栏空格数量动态生成可控,可以在属性窗口手动配置 3.窗口具有拖拽功能 4.窗口物品具有拖拽,及窗口间拖拽 5.可以在窗口使用物品的功能,物品有消耗扇形显示功能 具体效果图如下所示: 插件使用 1.具体在UGUI 中的Canvas中创建一个Invent

窗口显示类

窗口在前面已经注册,并且已经创建出来了,但这时这个窗口并不能出现在我们的眼前,又是什么原因呢?哦,还不显示出来,原来是有原因的,就是窗口有多种状态,窗口可以隐藏.普通显示.最大化显示.最小化显示等.并且创建出来时,不立即显示,也是可以方便一性地创建很多很多窗口,最后才一次性地显示出来:另外创建窗口之后在系统看来窗口已经是可用的,这时可以先在窗口上绘图,当完成时再一次性显示出来,也避免窗口不断地刷新时窗口在闪动,看起来让人眼花缭乱.因而在这里就封装一个窗口显示类Window,这个类非常简单,它的代

JavaFX战旗类游戏开发 第三课 创建游戏角色

在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.GraphicsContext; /** * 游戏物体基类 * @author Wing Mei */ public abstract class BaseObject { protected double x, y; protected double width,height; protected bool