import javafx.application.Application; import javafx.scene.Group; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.scene.control.ChoiceBox; import javafx.collections.FXCollections; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; public class LayerTest extends Application { private Group root;//创建一个私有成员 节点组容器 private BorderPane borderPane; //创建一个私有成员 边框布局对象 private Canvas layer1; //创建画布1 private Canvas layer2; //创建画布2 private GraphicsContext gc1; //私有画笔对象1(画笔上下文1) private GraphicsContext gc2; //私有画笔对象2 (画笔上下文2) private ChoiceBox cb;//选择框控件 private void createLayers(){//私有方法创建层 // Layers 1&2 are the same size layer1 = new Canvas(300,250);//创建画布对象1 layer2 = new Canvas(300,250);//创建画布对象2 // Obtain Graphics Contexts gc1 = layer1.getGraphicsContext2D();//获得图层一上的绘画上下文(创建canvas上的画笔对象) gc1.setFill(Color.GREEN);//画笔填充绿色墨水 gc1.fillOval(50,50,20,20);//画一个小椭圆形 gc2 = layer2.getGraphicsContext2D();//创建图层画布layer2上的画笔对象(获取canvas对象layer2对象上的绘画上下文环境对象) gc2.setFill(Color.BLUE);//画笔2填充蓝色染料 gc2.fillOval(100,100,20,20);//利用画笔2画一个小椭圆 } private void handleLayers(){ // Handler for Layer 1 layer1.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {//canvas对象 layer1上面添加鼠标按压事件处理器机制 @Override public void handle(MouseEvent e) { gc1.fillOval(e.getX(),e.getY(),20,20); }//鼠标事件回调方法利用画笔1在对应的画布上layer1画一个椭圆 }); // Handler for Layer 2 layer2.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {//canvas对象 layer2上面添加鼠标按压事件处理器机制 @Override public void handle(MouseEvent e) { gc2.fillOval(e.getX(),e.getY(),20,20); }//鼠标事件回调方法利用画笔2在对应的画布layer2上画一个椭圆 }); } private void createChoiceBox(){ cb = new ChoiceBox();//创建选择框控件对象 cb.setItems(FXCollections.observableArrayList("Layer 1 is GREEN", "Layer 2 is BLUE"));//将选择框对象上添加选项 cb.getSelectionModel().selectedItemProperty().addListener(new ChangeListener(){// 设置选择控件的选择属性并添加事件监听器对象 @Override public void changed(ObservableValue o, Object o1, Object o2){//内容改变事件处理回调函数/钩子方法(利用的gof23设计模式中的观察者模式) if(o2.toString().equals("Layer 1 is GREEN")){//当判断当前选择layer1对应的文本选项时候 layer1.toFront();//将layer1画布对象置前位置 }else if(o2.toString().equals("Layer 2 is BLUE")){//当判断当前选择layer2对应的文本选项时候 layer2.toFront();//将layer2画布对象置前 } } }); cb.setValue("Layer 1 is GREEN");//初始化时候设置ChoiceBox类型对象的默认选择项 } private void addLayers(){//添加 画布对象到前文初始化建立好的 节点对象布局容器当中 // Add Layers borderPane.setTop(cb); //borderPane布局容器中添加 ChoiceBox类型ui控件对象cb Pane pane = new Pane();//创建一个面板对象 pane.getChildren().add(layer1);//面板上添加 Canvas类型对 layer1 pane.getChildren().add(layer2);//面板上添加 Canvas类型对 layer2 layer1.toFront();//将layer1对象位置置顶 borderPane.setCenter(pane); //borderPane对象的中心位置添加Pane类型面板对象 pane root.getChildren().add(borderPane);//根节点组容器添加 borderPane对象 } public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) {//启动舞台对象方法 // Build GUI borderPane = new BorderPane(); //创建BorderPane类型布局面板对象 primaryStage.setTitle("Layer demo");//设置舞台标题 root = new Group();//创建节点组容器对象 createLayers();//创建图层 handleLayers();//绑定图层 canvas 对象的事件处理机制 createChoiceBox();//创建选项组件及其事件处理绑定机制代码 addLayers(); //默认添加并布局图层对象 // Show Scene primaryStage.setScene(new Scene(root));//舞台上添加场景,场景上添加节点组容器 primaryStage.show();//舞台放映展现 } }