2017-07-16 450 views
1

我的控制器類中有很大的事件處理方法。我把他們每個人放在一個單獨的班級,但現在他們不再被調用。通過自定義類在javafx中添加事件處理程序

這是它是如何目前實施:

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); 
+0

能否請您編輯您的問題,包括......好一個問題嗎? –

+0

@JoeC謝謝,我忘了實際問這個問題 – Vinagy

回答

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

} 
+0

感謝您的回答,顯然我在構造函數被調用事件處理函數之前調用它。 – Vinagy

1

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"); 
     } 
    } 
} 
+0

感謝您的回答,在構造函數調用事件處理函數之前,我明顯地調用了它。 – Vinagy

相關問題