2016-02-12 66 views
2

我有下面這個例子,我想把我的文本「文本」和我的事件一起傳遞(當我點擊按鈕「bla」時)。我該怎麼做?如何通過javafx中的事件傳遞參數?

EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      System.out.println(text); 
     } 
    }; 

    public void test(){ 
    //... 

    Text text = "123567"; 

    bla.setOnMousePressed(handler); 

    //... 
    } 

小問題:

當我有以下幾點:

object1.setOnMouseClicked(event -> { 
     System.out.println("HELLO"); 
    }); 

    object2.setOnMouseClicked(event -> { 
     System.out.println("HELLO"); 
    }); 

兩個對象,做同樣的事情時,對他們的 「setOnMouseClicked」。有沒有合併它們的語法?

+0

給我5分鐘,需要得到我的電腦,但是你的問題應該回答 – JohnRW

回答

4

您可以通過多種方式進行操作。 如果要沿着傳遞參數是事件源的一部分或目標,您可以:

  • 使用的getSource或getTarget方法
  • 檢查類源或目標
  • 投源/目標到類
  • 通過該類

不過的getter和setter

  • 接入參數,如果該參數沒有任何與事件,你將不得不編寫自定義事件:

    class CustomEvent extends Event { 
    
        private String parameter; 
    
        public static final EventType<CustomEvent> CUSTOM = new EventType(ANY, "CUSTOM"); 
        public CustomEvent(String parameter) { 
         super(CustomEvent.CUSTOM); 
         this.parameter = parameter; 
        } 
    
        public String getParameter() { 
         return this.parameter; 
        } 
    
    } 
    

    現在要使用該事件,您首先必須解僱它。

    爲此,您可以用

    objectThatWillFireThisEvent.fireEvent(new CustomEvent("Get this parameter guys!")); 
    

    所以你現在解僱帶有參數的事件。現在設置事件處理簡單的內容添加到該對象的類別中,這將觸發事件:

    public final void setOnCustomEvent(
         EventHandler<? super CustomEvent> value) { 
        this.addEventHandler(CustomEvent.CUSTOM, value); 
    } 
    

    現在,您可以設置事件處理程序:

    objectThatWillFireTheEvent.setOnCustomEvent(event -> { 
        System.out.println(event.getParameter()); 
    }); 
    

    或者,如果願意,你可以使用方式編寫您在問題中發佈的事件處理程序(如果您不想使用lambdas)。

    或者,你可以叫你寫了一個函數,那應該處理參數:

    objectThatWillFireTheEvent.setOnCustomEvent(event -> myFunction(event.getParameter)); 
    

    我希望我沒有做任何錯別字。但是如果有什麼不管用或者你還有什麼問題,請不要猶豫,問問! :)

    除此之外,我會建議你谷歌鑄造(如果你不知道已經)和更多的自定義事件(因爲我的答案只是一個起點,如果你想做更瘋狂的狗屎與自定義事件最好是閱讀:D)

    編輯: 這是你的意思是在你的評論?

    因爲評論會破壞佈局和可讀性

    String text = "This is text!"; 
    Button button = new Button(); 
    object.setOnMouseClicked(event -> { 
        function1(text); 
        function2(button); 
    }); 
    
  • +0

    在這裏你可以找到鑄造答案:HTTP://計算器。 com/questions/23928132/javafx-eventhandler-pass-parameter – JohnRW

    +0

    如果您想不惜一切代價避免自定義事件,那麼您可以使用自定義參數,setter和getter擴展引發事件的類,並使用事件源/目標方法再次得到它。不過,我強烈反對這個建議,因爲在概念上沒有連接到類的參數不應該添加到實現類中;) – JohnRW

    +0

    謝謝 - 另一個小問題: 當我確實有兩個元素,比如說「文本「和」按鈕「 - 我想綁定他們兩個函數時,」setOnMouseClick「完成...有沒有我可以使用任何語法,而不是寫text.setOnMouseClicked(new EventHandler (){...} + button.setOnMouseClicked(new EventHandler (){...} - 是否有任何簡單的方法,如說文本和button.setOnMouseClicked .... - 因爲那樣我就不需要上面的東西 - 我可以說它應該做同樣的事情對於這兩個元素,當onmouse ..被解僱時 – user3650191