2017-09-09 35 views
0

この問題を解決できますか?javafxボタンに追加のアクションを追加

クラスCellにボタンを作成し、このボタンにいくつかのデフォルトアクションを追加します。クラスGame

public class Cell { 
    private Button button; 

    public Cell() { 
     this.button = new Button(); 
     this.button.setOnAction(e -> System.out.println("Default action")); 
    } 

    public Button getButton() { 
     return button; 
    } 
} 

私は、このボタンに追加のアクションを追加したいが、私はどちらかのデフォルトのアクションを維持したいと思います。

public class Game { 

    public Game(Button button) { 
     // this add new action to button but delete previous one 
     // I want use both actions 
     button.setOnAction(e -> System.out.println("additional action")); 
    } 
} 

私は新しい動作が前の動作よりも優先されることを知っています。ボタンをクリックすると、additional actionだけが印刷されます。

public class Main extends Application{ 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Cell cell = new Cell(); 
     Button button = cell.getButton(); 
     Game game = new Game(button); 
     VBox vBox = new VBox(button); 
     Scene scene = new Scene(vBox); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 
} 

ボタンに新しいアクションを追加することは可能ですか?

+0

何を達成しようとしていますか?両方のアクションが必要な場合は、そのアクションを1つのアクションで書くのはなぜですか? –

答えて

3

あなたは新しいものを設定する前に現在のアクションを取得し、古いものと新しいものの両方を呼び出すことができます。

public Game(Button button) { 
    EventHandler<ActionEvent> current = button.getOnAction(); 
    button.setOnAction(e -> { 
     current.handle(e); 
     System.out.println("additional action"); 
    }); 
} 
2

JavaFXのは、イベントに複数のハンドラを取り付けるためのサポートが組み込まれています。文書番号addEventHandlersetEventHandler(接頭辞setOnを呼び出したときに呼び出されます)を確認してください。覚えておくべきことの1つは、で接続されたハンドラがsetOnメソッドの前にトリガされることです。つまり、setOnActionで接続されたハンドラが最後にトリガされます。 Gameを次のように変更することができます:

public class Game { 

    public Game(Button button) { 
    // this add new action to button but delete previous one 
    // I want use both actions 
    button.addEventHandler(ActionEvent.ACTION, e -> System.out.println("additional action")); 
    } 

} 
関連する問題