【问题标题】:Adding an eventhandler in javafx through a custom class通过自定义类在 javafx 中添加事件处理程序
【发布时间】:2017-07-16 18:58:42
【问题描述】:

我的控制器类中有非常大的事件处理方法。我将它们分别放在一个单独的类中,但现在它们不再被调用了。

这是目前的实现方式:

private DragDetectedHandler dragDetectedHandler = new DragDetectedHandler(stacks, nextCards, gameTable);;
node.setOnDragDetected(dragDetectedHandler);

如果我称它为有效:

node.setOnDragDetected(System.out::println);

(只是为了测试代码是否到达)

以及处理程序类:

public class DragDetectedHandler implements EventHandler<MouseEvent> {
private Stacks stacks;
private NextCards nextCards;
private Table gameTable;

public DragDetectedHandler(Stacks stacks, NextCards nextCards, Table gameTable) {
    this.stacks = stacks;
    this.nextCards = nextCards;
    this.gameTable = gameTable;
}

@Override
public void handle(MouseEvent mouseEvent) {
    System.out.println("Handle stuff here :)");
}
}

我可能忽略了一些东西,但类似的问题并没有帮助我得到答案。

所以问题是:我应该如何调用事件处理程序?或者为什么下面的代码没有调用事件处理函数?

node.setOnDragDetected(dragDetectedHandler);

【问题讨论】:

  • 您能否编辑您的问题以包括...嗯...一个问题?
  • @JoeC 谢谢,我忘了问这个问题

标签: java events javafx event-handling


【解决方案1】:

我试用了这段代码,发现它对我有用。

要尝试找出可能出错的地方,您可以检查您正在导入的内容,并确保它是 javafx 而不是 swing 或 awt。

这是我尝试过的:

package test;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;

public class DragDetectedHandler implements EventHandler<MouseEvent> {

private String test;

public DragDetectedHandler(String test) {
    this.test = test;
}

@Override
public void handle(MouseEvent mouseEvent) {
    System.out.println("Handle stuff here :)");
}
}

和其他类:

package test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;


public class Test2 extends Application{

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

@Override
public void start(Stage stage) throws Exception {
    DragDetectedHandler dragDetectedHandler = new 
       DragDetectedHandler("Test");
    Button button = new Button();
    button.setOnDragDetected(dragDetectedHandler);
    Scene scene = new Scene(button);
    stage.setScene(scene);
    stage.show();
}

}

【讨论】:

  • 感谢您的回答,显然我是在为事件处理程序调用构造函数之前调用它的。
【解决方案2】:

Node 应该启用,这样该事件才会起作用。

我试过这段代码,当我拖动矩形时它就可以工作了:

public class Main extends Application
{

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

    @Override
    public void start(Stage stage) throws Exception
    {
        DragHandler dh = new DragHandler();
        StackPane pane = new StackPane();
        Rectangle rect = new Rectangle(200 , 200 , 200 ,200);
        rect.setOnDragDetected(dh);
        pane.getChildren().add(rect);
        Scene scene = new Scene(pane , 600 , 600);
        stage.setScene(scene);
        stage.show();
    }

    private class DragHandler implements EventHandler<MouseEvent>
    {
        @Override
        public void handle(MouseEvent event)
        {
            System.out.println("OK");
        }
    }
} 

【讨论】:

  • 感谢您的回答,显然我是在为事件处理程序调用构造函数之前调用它的。
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2010-09-23
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多