2016-06-18 29 views
3

javafxの使い方を非常に基本的な電卓を使ってシーンビルダと一緒に学習していますが、私は別々の方法を見つけるのが難しい問題に遭遇しましたボタンごとに機能します。変数を変更したり、ボタンがリンクされているアクションイベントメソッドに引数を渡す方法があるかどうかを知る必要があるので、ボタンごとに別の関数を呼び出す必要はありません。これは私が働いているものの例です。JavafxボタンがActionEvent関数に引数を送信する

@FXML 
private Button one; 
private Button two; 
//both buttons are linked to NumChange 

private void NumChange(ActionEvent e) { 
    //update the number to preform an operation with here 
} 

は、どのように私はすべての数字ボタンは同じ機能を使用していますが、それは別のことを行うことができますので、それを引数を送っていますか?

私が見つけた答えのすべては、ボタンのテキストを取得することを含んでいますが、私の電卓は奇妙で、私はそれらの単語を綴っていますので、私は何ができますか?あなたはFXMLでハンドラを登録している場合

+0

'one.setOnAction(イベント - > NumChange(...));' 'two.setOnAction(イベント - > NumChange(...));' – Kachna

+2

@Foo [標準命名規則]を使用してください(https://en.wikipedia.org/wiki/Naming_convention_(プログラミング)#Java) –

答えて

8

最善の方法をしたい各ボタンの上に呼び出し、それぞれに異なる方法を定義するために実際にありますボタン。次のようにコードを最小化することができます。

numChange(...)メソッドを定義して、必要なパラメータを取得します。

private void numChange(int num) { 
    // process num here... 
} 

、その後numChange()単に委譲し、各ボタンに別のハンドラメソッドを定義:

<Button fx:id="one" onAction="#handleButtonOne" ... /> 
<Button fx:id="two" onAction="#handleButtonTwo" ... /> 

あなたが変えることができます。

@FXML 
private void handleButtonOne() { 
    numChange(1); 
} 

@FXML 
private void handleButtonTwo() { 
    numChange(2); 
} 

、その後はFXMLで明らかな変化を加えるともちろん、必要に応じてnumChange()が受け入れるパラメータの数および/またはタイプ。しかし、これは単に多くもたらす

<Button fx:id="one" onAction="#numChange" userData="1" ... /> 
<Button fx:id="two" onAction="#numChange" userData="2" ... /> 


専用メソッドを有する各ボタンを回避する別のFXMLベースのソリューション、そのユーザデータを設定することにより、FXMLのノードとの値を関連付けることです私見は、以前のソリューションよりも少ない有用にダウンキャストと型変換の:

@FXML 
private void numChange(ActionEvent event) { 
    Node node = (Node) event.getSource() ; 
    String data = (String) node.getUserData(); 
    int value = Integer.parseInt(data); 

    // ... 
} 

最後に、ちょうど、コントローラに直接ハンドラを登録する方が簡単かもしれません:

<Button fx:id="one" ... /> 
<Button fx:id="two" ... /> 

public class Controller { 

    @FXML 
    private Button one ; 

    @FXML 
    private Button two ; 

    public void initialize() { 
     one.setOnAction(e -> numChange(1)); 
     two.setOnAction(e -> numChange(2)); 
    } 

    private void numChange(int value) { 
     // ... 
    } 
} 
-1

だけEventHandler<ActionEvent>を実装したり、クラスでEventHandler<ActionEvent>アノニムクラスを作成し、setOnAction(myAction);

+0

なぜisnそれは役に立ちますか? – user3502626

関連する問題