zoukankan      html  css  js  c++  java
  • JAVAFX-5事件总结

    事件监听

    在RIA 或者说 桌面客户端gui android 开发中,事件的机制是必须的要学习了解的,

    分类处理类型

    在Java GUI 和swing中,事件通常通过实现listener的接口函数,并通过addXXXListener 或者 setOnXXXListener的形式来设置接口函数来实现事件的执行。

    -因此JavaFX的监听分为两种:

    • 控件级别监听 ----->setonxxxxxxx()

    • 属性级别监听 ----->onxxxxxxProperty().addxxxxxxx()
      然而在JavaFX中,只有极少数的事件是遵循Java GUI和Android的模式即控件级别的监听,例如,按钮的点击事件 。还增加了 触摸事件 onTouch() 事件

    • 这里要特别说一下: 如果要一个类实现监听所有的鼠标事件,一般的方法是传参数类值过去,然后判断操作,但是这样不能实现操作

    package application;
    
    import javafx.event.EventHandler;
    import javafx.scene.input.MouseEvent;
    
    public class myHandlert implements EventHandler<MouseEvent> {
    
    	@Override
    	public void handle(MouseEvent event) {
    		System.out.println(event.getSource());
    		if (event.getSource()=="Button[id=btnEraser, styleClass=button]'橡皮擦'") {
    			System.out.println(1);
    		}
    		if (event.getSource().equals("Button[id=btnBrush, styleClass=button]'画笔'")) {
    			System.out.println(2);
    		}
    	}
    
    }
    
    
    • 控件级别监听(代码量少可以使用):
    Button btn = new Button();
    btn.setOnAction(new EventHandler<ActionEvent>() {
    
        @Override
        public void handle(ActionEvent event) {
            doing codeing
        }
    });
    
    • 2.实现EventHandler接口,单独类创建事件代码,与主代码分离,我更青睐这种方式,可以统一管理事件,UI与具体事件分离:
    Button btn = new Button();
    button.addEventHandler(MouseEvent.MOUSE_EXITED, new ShadowEvent(button,false));
    
    public class ShadowEvent implements EventHandler<MouseEvent> {
    
        Button button;
        DropShadow dropShadow;
        boolean select;
    
        public ShadowEvent(Button button,DropShadow dropShadow,boolean select){
            this.button = button;
            this.dropShadow = dropShadow;
            this.select = select;
        }
    
        public ShadowEvent(Button button,boolean select){
            this.button = button;
            this.select = select;
        }
    
        public void handle(MouseEvent event) {
            if (select){
                button.setEffect(dropShadow);
            } else {
                button.setEffect(null);
            }
    
        }
    }
    
    • 属性级别监听:
      [] 比如监听checkbox是否选中,这是对selectedProperty这个属性进行监听,因此需要实现ChangeListener接口。
    // CatalogCheckPage.java代码片段
    checkBox.selectedProperty().addListener(new MyCheckBoxListener(checkBox,buttonOfPreEditionDataPath,textInputOfPreEditionDataPath));
    
    // MyCheckBoxListener.java代码片段
    public class MyCheckBoxListener implements ChangeListener<Boolean> {
    
        TextField textfield = new TextField();
        Button button = new Button();
        CheckBox checkBox;
    
        public MyCheckBoxListener(CheckBox checkBox,Button button,TextField textfield){
            this.checkBox = checkBox;
            this.button = button;
            this.textfield = textfield;
        }
    
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue){
            boolean select = checkBox.isSelected();
            // logger.info("checkbox newValue:" + newValue +",oldValue:"+oldValue);
            if (!select) {
                textfield.setDisable(true);
                button.setDisable(true);
            } else {
                textfield.setDisable(false);
                button.setDisable(false);
            }
        }
    }
    
    • 比如监听窗口大小的改变,这是对Stage类的widthProperty这个属性进行监听,因此需要实现ChangeListener接口,同时ChangeListener里会回调一个“属性改变前的值”和“属性改变后的值
    / MainPage.java代码片段
    primaryStage.widthProperty().addListener(new StageChangeListener(primaryStage));
    
    // StageChangeListener.java窗体变化监听,当前用来设置图标
    public class StageChangeListener implements ChangeListener<Number> {
    
        Stage stage;
    
        public StageChangeListener(Stage stage){
            this.stage = stage;
        }
    
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
    
            stage.getIcons().add(ImageUtil.getImage("/image/tools.png"));
        }
    }
    

    所以在JavaFX中,所有跟属性改变相关的事件,都可以根据 XXX.xxxxProperty().addListener 的形式来进行事件监听。理解这种方式将极大提升我们的开发效率。这样的属性还有很多,根据需要来操作.

  • 相关阅读:
    1052. 爱生气的书店老板
    766. 托普利茨矩阵
    643.子数组的最大平均数I
    450. 删除二叉搜索树中的节点
    1489.找到最小生成树里的关键边和伪关键边
    839相似字符串
    1631.最小体力消耗路径
    SnowFlake雪花算法源码分析&灵活改造,常见分布式ID生成解决方案
    【目标检测】三、Faster R-CNN与R-FCN
    【目标检测】二、Fast R-CNN与SVD
  • 原文地址:https://www.cnblogs.com/dgwblog/p/7955930.html
Copyright © 2011-2022 走看看