zoukankan      html  css  js  c++  java
  • 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());
    	}    
    }
    
    
    
  • 相关阅读:
    多线程频繁上锁同步还不如用单线程
    1分钟左右随机生成2000万行随机字符串
    语言:抽象,封装,底层,低级
    构建WDK驱动出现fatal error U1087: cannot have : and :: dependents for same target
    Cmake编译成静态库
    VMware虚拟机相关文件问题
    输出流重定向
    How can I let the compiled script depend on something dynamic
    应用服务攻击工具clusterd
    Kali Linux缺少ifconfig命令
  • 原文地址:https://www.cnblogs.com/l20902/p/10610911.html
Copyright © 2011-2022 走看看