ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

第十五章 事件驱动编程

2021-07-03 17:33:43  阅读:198  来源: 互联网

标签:一个 gridPane 编程 事件驱动 add 第十五章 new TextField 事件


引言

  • 事件处理器:一个能对一个按钮动作事件进行处理的对象
    在这里插入图片描述
    在这里插入图片描述

事件和事件源

  • 事件是从一个事件源上产生的对象

  • 触发一个事件意味着产生一个事件并委派处理器处理该事件

  • 事件驱动编程:当运行一个Java GUI程序的时候,程序和用户进行交互,并且事件驱动它的执行

  • 一个事件可以被定义为一个通知程序某件事发生的信号

  • 事件源对象:产生并触发一个事件的组件,或者简单称为源对象或源组件

  • 一个事件是一个事件类的实例

  • Java事件类的根类是java.util.EventObject

  • JavaFX的事件类的根类是javafx.event.Event
    在这里插入图片描述

  • 一个事件对象包含与该事件相关的所有属性

  • 可以通过EventObject类中的getSourse()实例方法来确定一个事件的源对象

  • 如果一个组件可以触发一个事件,那么这个组件的任何子类都可以触发同样类型的事件

注册处理器和处理事件

  • 处理器是一个对象,它必须注册到一个事件源对象上,并且它必须是一个恰当的时间处理接口的实例
  • Java采用一个基于委派的模型来进行事件处理:一个源对象触发一个事件,然后一个对该事件该兴趣的对象处理它,后者称为一个事件处理器或者一个事件监听器
  • 一个对象如果要成为一个源对象上时间的处理器,需要满足两个条件:
    1,处理器对象必须是一个对应的事件处理接口的实例
    2,处理器对象必须注册到源对象上,注册方法依赖于事件类型
    在这里插入图片描述

内部类

  • 内部类,或者称为嵌套类,是定义在另外一个类范围中的类
    在这里插入图片描述

  • 通常,在一个类只被它的外部类所使用的时候,才将它定义为内部类

  • 一个内部类具有以下特征:
    1,一个内部类被编译成一个名为OuterClassName$InnerClassName的类
    2,一个内部类可以引用定义在它所在的外部类中的数据和方法
    3,一个内部类可以使用可见性修饰符所定义,和应用在一个类中成员的可见性规则一样
    4,一个内部类可以被定义为static,一个static的内部类可以使用外部类的名字所访问,一个static的内部类不能访问外部类中非静态的成员
    5,内部类对象通常在外部类中创建

  • 内部类的用途:
    1,将相互依赖的类结合到一个主类中
    2,避免类名的冲突

匿名内部类处理器

  • 匿名内部类是一个没有名字的内部类
  • 它将定义一个内部类以及创建一个内部类的实例结合在一步实现
  • 语法:在这里插入图片描述
  • 特征:
    1,一个匿名内部类必须总是从一个父类继承或者实现一个接口,但是它不能有显式的extends或者implements子句
    2,一个匿名内部类必须实现父类或者接口中的所有抽象方法
    3,一个匿名内部类总是使用它父类的无参构造方法来创建一个实例
    4,一个匿名内部类被编译成一个名为OuterClassName$n.calss

使用lambda表达式简化事件处理

  • 语法:
    在这里插入图片描述

示例学习:贷款计算器

package chapter15;
//listing 15-6
import chapter10.Loan;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.geometry.HPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class LoanCalculator extends Application {
  private TextField tfAnnualInterestRate = new TextField();
  private TextField tfNumberOfYears = new TextField();
  private TextField tfLoanAmount = new TextField();
  private TextField tfMonthlyPayment = new TextField();
  private TextField tfTotalPayment = new TextField();
  private Button btCalculate = new Button("Calculate");
  
  @Override // Override the start method in the Application class
  public void start(Stage primaryStage) {
    // Create UI
    GridPane gridPane = new GridPane();
    gridPane.setHgap(5);
    gridPane.setVgap(5);
    gridPane.add(new Label("Annual Interest Rate:"), 0, 0);
    gridPane.add(tfAnnualInterestRate, 1, 0);
    gridPane.add(new Label("Number of Years:"), 0, 1);
    gridPane.add(tfNumberOfYears, 1, 1);
    gridPane.add(new Label("Loan Amount:"), 0, 2);
    gridPane.add(tfLoanAmount, 1, 2);
    gridPane.add(new Label("Monthly Payment:"), 0, 3);
    gridPane.add(tfMonthlyPayment, 1, 3);
    gridPane.add(new Label("Total Payment:"), 0, 4);
    gridPane.add(tfTotalPayment, 1, 4);
    gridPane.add(btCalculate, 1, 5);

    // Set properties for UI
    gridPane.setAlignment(Pos.CENTER);
    tfAnnualInterestRate.setAlignment(Pos.BOTTOM_RIGHT);
    tfNumberOfYears.setAlignment(Pos.BOTTOM_RIGHT);
    tfLoanAmount.setAlignment(Pos.BOTTOM_RIGHT);
    tfMonthlyPayment.setAlignment(Pos.BOTTOM_RIGHT);
    tfTotalPayment.setAlignment(Pos.BOTTOM_RIGHT);
    tfMonthlyPayment.setEditable(false);
    tfTotalPayment.setEditable(false);
    GridPane.setHalignment(btCalculate, HPos.RIGHT);

    // Process events
    btCalculate.setOnAction(e -> calculateLoanPayment());

    // Create a scene and place it in the stage
    Scene scene = new Scene(gridPane, 400, 250);
    primaryStage.setTitle("LoanCalculator"); // Set title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
  }
  
  private void calculateLoanPayment() {
    // Get values from text fields
    double interest =
      Double.parseDouble(tfAnnualInterestRate.getText());
    int year = Integer.parseInt(tfNumberOfYears.getText());
    double loanAmount =
      Double.parseDouble(tfLoanAmount.getText());

    // Create a loan object. Loan defined in Listing 10.2
    Loan loan = new Loan(interest, year, loanAmount);

    // Display monthly payment and total payment
    tfMonthlyPayment.setText(String.format("$%.2f",
      loan.getMonthlyPayment()));
    tfTotalPayment.setText(String.format("$%.2f",
      loan.getTotalPayment()));
  }
  
  /**
   * The main method is only needed for the IDE with limited
   * JavaFX support. Not needed for running from the command line.
   */
  public static void main(String[] args) {
    launch(args);
  }
}

在这里插入图片描述

标签:一个,gridPane,编程,事件驱动,add,第十五章,new,TextField,事件
来源: https://blog.csdn.net/qq_43701604/article/details/118441149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有