java基础:10.6 事件驱动

当运行一个JAVA GUI程序时,程序和用户进行交互,并且事件驱动它的执行。这叫事件驱动编程。产生一个事件并且触发它的组件称为事件源对象,或者简单称为源对象或者源组件。例如,一个按钮是一个按钮单击动作事件的源对象。一个事件是一个事件类的实例。可以通过EventObject 类中的getSource()实例方法来确定一个事件的源对象

Java 事件类的根类是java.util.EventObject。JavaFX 的事件类的根类javafx.event.Event

Event 包括:ActionEvent / InputEvent / WindowEvent 

如果一个组件可以触发一个事件,那么这个组件的任何子类都可以触发同样类型的事件。比如,每个JavaFX 形状、布局面板和组件都可以融发MouseEvent 和KeyEvent 事件,因为Node 是形状、布局面板和组件的超类。

要成为一个动作事件的处理器,必须满足两个要求:
1 ) 该对象必须是EventHandler <T extends Event> 接口的一个实例。接口定义了所有处理器的共同行为。<T extends Event> 表示T 是一个Event 子类型的泛型。
2) EventHandler 对象handler 必须使用方法source.setOnAction(handler)和事件源对象注册。处理器对象必须通过源对象进行注册。注册方法依赖于事件类型。对ActionEvent 而言,方法是setOnAction。对一个鼠标按下事件来说,方法是setOnMousePressed。对于一个按键事件,方法是set0nKeyPressed。

学习代码:点击按钮可以放大/缩小圆

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Chapter15_2 extends Application {
	private CirclePane circlePane = new CirclePane();
	
	@Override
	public void start(Stage primaryStage) {   
		HBox hbox = new HBox(10);
		hbox.setSpacing(10);
		hbox.setAlignment(Pos.CENTER);
		Button btEnlarge = new Button("Enlarge");
		Button btShrink = new Button("Shrink");
		hbox.getChildren().add(btEnlarge);
		hbox.getChildren().add(btShrink);
		
		//create and register the handler
		btEnlarge.setOnAction(new EnlargeHandler());
		btShrink.setOnAction(new ShrinkHandler());
		
		BorderPane borderpane = new BorderPane();
		borderpane.setCenter(circlePane);
		borderpane.setBottom(hbox);
		BorderPane.setAlignment(hbox,Pos.CENTER);
		
		Scene scene = new Scene(borderpane,200,150);
		primaryStage.setTitle("ControlCircle");
		primaryStage.setScene(scene);
		primaryStage.show();
		
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Application.launch(args);
	}

	class EnlargeHandler implements EventHandler <ActionEvent> {
		@Override
		public void handle(ActionEvent e) {
			circlePane.enlarge();
		}
	}

	class ShrinkHandler implements EventHandler <ActionEvent> {
		@Override
		public void handle(ActionEvent e) {
			circlePane.shrink();
		}
	}
}

class CirclePane extends StackPane{
	private Circle circle = new Circle(50);
	
	public CirclePane() {
		getChildren().add(circle);
	    circle.setFill(Color.WHITE);
	    circle.setStroke(Color.BLACK);
	}
	
	public void enlarge() {
		circle.setRadius(circle.getRadius() + 2 );
	}
	
	public void shrink() {
		circle.setRadius(circle.getRadius() >2 ? circle.getRadius()-2 : circle.getRadius());
	}    
}


 

posted @ 2019-01-26 16:44  Aurora_l  阅读(470)  评论(0编辑  收藏  举报