当前位置: 首页 > 知识库问答 >
问题:

JavaFx:从事件处理程序访问对象

谷梁宁
2023-03-14

我想在JavaFX中制作一个程序,其中包含一个按钮,单击该按钮时,将创建一个圆并将其添加到形状的ArrayList中。以下是我的代码:

createCircleBtn.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
        public void handle(MouseEvent event) {
            Circle circle1 = new Circle();
            shapes.add(circle1);
            circle1.setCenterX(event.getX());
            circle1.setCenterY(event.getY());
            circle1.setOnMouseDragged(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
         // doesn't work because "circle1" must be declared final (constant) 
                    circle1.setCenterX(event.getX());
                    // "this" doesn't refer to "circle1"
                    this.setCenterY(event.getY());
                }
            });
            mainPane.getChildren().add(circle1);
        }
    });

我的问题是-如何从内部句柄方法访问“circle1”?在JavaScript中,我们使用e.currentTarget。

我无法声明“Circle1”最终版本,因为我需要在之后更改它。

共有2个答案

宦正诚
2023-03-14

使用event.getSource(),这样可以为多个cicrles编写一个通用事件处理程序,而不必担心单击了哪一个:

EventHandler<MouseEvent> handler = new EventHandler<>()
{
    @Override
    public void handle( MouseEvent event )
    {
        if (event.getSource() instanceof Circle) { // to be on safe side, you may 
                                                   // remove this if-statement 
                                                   // if you are sure
            Circle c = event.getSource();
            c.setCenterX( event.getX() );
        }
    }
};

// use it on multiple circles
circle1.setOnMouseDragged(handler);
circle2.setOnMouseDragged(handler);
...
circleN.setOnMouseDragged(handler);
唐俊英
2023-03-14

在显示的代码中,没有任何地方可以重新指定圆圈1,因此可以将其声明为final:

createCircleBtn.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
        public void handle(MouseEvent event) {
            final Circle circle1 = new Circle();
            shapes.add(circle1);
            circle1.setCenterX(event.getX());
            circle1.setCenterY(event.getY());
            circle1.setOnMouseDragged(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    circle1.setCenterX(event.getX());
                }
            });
            mainPane.getChildren().add(circle1);
        }
    });

请注意,在Java 8中,您的代码将按原样编译,因为圆圈1实际上是最终的(这意味着它只分配了一次,并且永远不会重新分配)。

 类似资料:
  • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使

  • 问题内容: 我在JavaFX中有一个舞台,可以通过多种方式关闭该舞台,方法是单击红色(X)或通过一个调用 无论舞台如何关闭,我都希望在舞台关闭之前(或之后)执行操作。 如果我使用以下代码: 然后当我单击(X)时调用处理程序,但当我调用 不同之处在于,他希望在整个应用程序关闭时调用处理程序,因此可以覆盖的方法。但是,我并没有关闭整个应用程序,只是一个阶段。并且没有重写的方法。 谢谢你的帮助。 问题答

  • 我在JavaFX中有一个阶段,可以通过多种方式关闭,通过单击红色(X)或通过调用的按钮 无论舞台如何关闭,我都想在舞台关闭之前(或关闭时)执行一个动作。 如果我使用以下代码: 然后,当我单击(X)时调用处理程序,但当我调用<code>myStage.close()</code>时不会调用 这与这个问题讨论的问题相同(有一个关键区别):JavaFX:Stage-close-handler 不同之处在

  • 事件就是用户或浏览器自身执行的某种动作。诸如click、load 和mouseover,都是事件的名字。而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以"on"开头,因此click 事件的事件处理程序就是onclick,load 事件的事件处理程序就是onload。为事件指定处理程序的方式有好几种。 13.2.1 HTML事件处理程序某个元素支持的每种事件,都可以使用一

  • 视图:简单FXML文件 控制器:包含视图中定义的事件处理程序函数,更新表示模型 表示模型:简单数据,包含可观察对象(ObjectProperty、ObservableList等) presenter:包含FXML文件中由fx:id定义的JavaFX节点,将这些节点绑定到表示模型中的可观察对象,并处理其他表示函数,如弹出窗口。这就是JavaFX应用程序。 正如您所注意到的,我的目的是将FXML对象(

  • 问题内容: 我正在用ES6(使用BabelJS)编写一个简单的组件,并且功能无法正常工作。 典型的错误包括类似 无法读取未定义的属性“ setState” 要么 this.setState不是一个函数 你知道为什么吗?这是代码: 问题答案: 在作为prop 传递之前,需要先通过绑定到组件实例,否则函数主体中的变量将不会引用组件实例,而会引用。参见Function :: bind 。 当使用而不是E