Events 同一窗格中对象的事件处理程序

Events 同一窗格中对象的事件处理程序,events,javafx,Events,Javafx,我正在研究javaFX上事件处理程序的机制,但我不确定我是否理解它,事实上我有一点怀疑: 如果我有两个对象,它们都有处理事件(EventHandler接口ecc..)所需的所有代码,它们属于同一个stackPane,问题是:第一个对象是否有方法启动一个事件(例如ActionEvent),尽管它们属于同一个窗格,但将由2个对象处理? 因为就我对“事件路线”的理解而言,这是不可能的,至少是直接的。 本质上,我的小程序有一个拆分窗格,将屏幕分为两个堆栈窗格。在左侧面板中,我放置了一个带按钮的网格窗格,

我正在研究javaFX上事件处理程序的机制,但我不确定我是否理解它,事实上我有一点怀疑: 如果我有两个对象,它们都有处理事件(EventHandler接口ecc..)所需的所有代码,它们属于同一个stackPane,问题是:第一个对象是否有方法启动一个事件(例如ActionEvent),尽管它们属于同一个窗格,但将由2个对象处理? 因为就我对“事件路线”的理解而言,这是不可能的,至少是直接的。 本质上,我的小程序有一个拆分窗格,将屏幕分为两个堆栈窗格。在左侧面板中,我放置了一个带按钮的网格窗格,每个窗格都具有允许绘制不同形状的功能,在右侧面板中,我使用画布

我的想法是在每个按钮的setonaction中启动一个ActionEvent,在画布上实现EventHandler来捕获事件 使用相对手柄方法,并在手柄模式下区分单击哪个按钮以绘制正确的形状。 有人能帮我吗?无论如何,非常感谢

软件包es1;
            package es1;

            import javafx.application.Application;
            import javafx.event.ActionEvent;
            import javafx.event.Event;
            import javafx.event.EventHandler;
            import javafx.scene.Scene;
            import javafx.scene.control.Button;
            import javafx.scene.control.SplitPane;
            import javafx.scene.control.TextField;
            import javafx.scene.layout.StackPane;
            import javafx.stage.Stage;

    /**
     *
     * @author DAVIDE
     */
         public class Es1 extends Application {

                @Override
                public void start(Stage primaryStage) {
                Button btn = new Button();
                btn.setText("Say 'Hello World'");
                btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                    lanciaevento(this.getClass().toString());

                }
            });

            //add a button on left panel and a textfiled on the right for test if the event launched
            //on the click of the button is reached by the textfield 
            Textfield text = new Textfield();
            StackPane panel1 = new StackPane();
            panel1.getChildren().addAll(btn);
            StackPane panel2 = new StackPane();
            panel2.getChildren().addAll(text);

            splitpane divisore = new splitpane();
            divisore.addEventHandler(ActionEvent.ACTION, divisore);
            divisore.getItems().addAll(panel1,panel2);


            Scene scene = new Scene(divisore, 600, 450);

            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();

        }


        public void lanciaevento(String oggetto)
        {
            ActionEvent evento    = new ActionEvent();
        }

        /**
         * @param args the command line arguments
         */


        public static void main(String[] args) {
            launch(args);
        }


       }
导入javafx.application.application; 导入javafx.event.ActionEvent; 导入javafx.event.event; 导入javafx.event.EventHandler; 导入javafx.scene.scene; 导入javafx.scene.control.Button; 导入javafx.scene.control.SplitPane; 导入javafx.scene.control.TextField; 导入javafx.scene.layout.StackPane; 导入javafx.stage.stage; /** * *@作者大卫 */ 公共类Es1扩展了应用程序{ @凌驾 公共无效开始(阶段primaryStage){ 按钮btn=新按钮(); btn.setText(“说‘你好,世界’”); btn.setOnAction(新的EventHandler(){ @凌驾 公共无效句柄(ActionEvent事件){ System.out.println(“你好,世界!”); lanciaevento(this.getClass().toString()); } }); //在左侧面板上添加一个按钮,在右侧添加一个文本文件,以便在事件启动时进行测试 //单击按钮后,文本字段将到达 Textfield text=新的Textfield(); StackPane Panel 1=新的StackPane(); panel1.getChildren().addAll(btn); StackPane Panel 2=新的StackPane(); panel2.getChildren().addAll(文本); splitpane divisiore=新的splitpane(); divisiore.addEventHandler(ActionEvent.ACTION,divisiore); divisiore.getItems().addAll(panel1、panel2); 场景=新场景(除数,600450); setTitle(“你好,世界!”); 初级阶段。场景(场景); primaryStage.show(); } 公共无效lanciaevento(字符串oggetto) { ActionEvento=新的ActionEvent(); } /** *@param指定命令行参数 */ 公共静态void main(字符串[]args){ 发射(args); } }

包es1;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.control.SplitPane;
/**
*
*@作者大卫
*/
公共类splitpane扩展splitpane实现EventHandler{
私有字符串消息_事件;
公共字符串get_message()
{
返回(消息\事件);
}
公共无效集_消息(字符串消息)
{
消息\事件=消息;
}
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“mi-ha-mandato-un-messaggio”+event.getSource().toString());
}
}

/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
包es1;
导入javafx.event.ActionEvent;
javafx.event.EventHandler;
导入javafx.scene.control.TextField;
/**
*
*@作者大卫
*/
公共类Textfield扩展Textfield实现EventHandler{
@凌驾
公共无效句柄(ActionEvent事件){
this.appendText(event.getSource().toString());
}
}

欢迎来到StackOverflow Deen!实际上,不同的javafx控件相互影响是很常见的。只要它们在同一范围内,这是可能的。您能否澄清一下您是如何创建按钮和事件处理程序的?您到底是在使用FXML,还是纯粹在java中使用FXML?此外,这个问题需要一些帮助,以减少文本墙。你能告诉我们你想做什么,你尝试了什么,包括a,以及你得到了什么结果吗?好的,首先谢谢你的回答,我会尝试用一些我编写的小代码来解释,假设这个按钮是我理想的带有一些按钮的网格窗格,文本字段是我的画布,我想在按下的按钮的基础上画一些形状,本质上,我想从按下按钮(setona action)启动一个事件,然后在textfield上处理它(我想在我的应用程序中做的相同事情:按下一个相对形状的按钮来绘制它)。
            package es1;

            import javafx.event.ActionEvent;
            import javafx.event.EventHandler;
            import javafx.scene.control.SplitPane;

            /**
             *
             * @author DAVIDE
             */
            public class splitpane extends SplitPane implements EventHandler<ActionEvent>{

                private String message_event;



                public String get_message()
                {
                 return(message_event);
                }

                public void set_message(String messaggio)
                {
                 message_event = messaggio;   

                }

                @Override
                public void handle(ActionEvent event) {
                            System.out.println("mi ha mandato un messaggio "+event.getSource().toString());

                }



            }
             /*
     * To change this license header, choose License Headers in Project Properties.

package es1;

   import javafx.event.ActionEvent;
   javafx.event.EventHandler;
   import javafx.scene.control.TextField;

/**
 *
 * @author DAVIDE
 */
public class Textfield extends TextField implements EventHandler<ActionEvent> {


    @Override
    public void handle(ActionEvent event) {
        this.appendText(event.getSource().toString());
    }

}