【问题标题】:Event handler for objects of the same Pane同一窗格的对象的事件处理程序
【发布时间】:2018-07-05 14:45:07
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 StackOverflow Deen!实际上,不同的 javafx 控件相互影响是很常见的。只要它们在同一范围内,这是可能的。你能澄清一下你是如何创建你的按钮和事件处理程序的吗?您是在使用 FXML 还是纯粹在 java 中使用?
  • 另外,这个问题需要一点帮助才能减少文字墙。你能告诉我们你想做什么,你尝试了什么,包括minimal reproducible example,你得到了什么结果?
  • 好的,首先感谢您的回答,我会尝试用我写的一些小代码来解释

标签: events javafx


【解决方案1】:
            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);
        }


       }

            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());
    }

}

【讨论】:

  • 假设按钮是我理想的带有一些按钮的网格窗格,文本字段是我的画布,我想在按下按钮的基础上绘制一些形状,本质上我想从按下启动一个事件按钮(setona 动作)然后在文本字段上处理它(我想在我的应用程序中做同样的事情:按下相对形状的按钮来绘制它。
猜你喜欢
  • 2013-08-17
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多