2017-03-02 2 views
1

私は10個のトグルボタンがtb1、tb2などと言っています。それぞれに1つのユーザーデータが添付されています。私は、ボタンがクリックされ、クリックされなくなったときに実行されるアクション(シーケンスの命令)のリスナーをアタッチする必要があります。私はリスナーを一般的に(すべてのボタンで使用可能)好むだろう。汎用リスナーを使用したJavaFXのToggleButtons

私が直面している問題は、リスナーのクリックされたボタンのユーザーデータにどうやってアクセスできるかです。これを手伝ってください。

@FXML 
private ToggleButton tb1; 
@FXML 
private ToggleButton tb2; 

String cpuLoad1 ="D:/myWorkspace/TestAttacks/input_folder/app_debug.apk"; 
String cpuLoad2 = "D:/myWorkspace/TestAttacks/input_folder/cpuLoad1.apk"; 


public void initialize(){ 

    tb1.setUserData(cpuLoad1); 
    tb2.setUserData(cpuLoad2); 

    ChangeListener clt1 = new ChangeListener() { 
     public void changed(ObservableValue ov, 
       Object toggle, Object new_toggle){ 
      if(new_toggle.equals(true)){ 

       /*how can I acces togglebutton userdata here. 
       *I would like to pass it as arguement to this class object*/ 
       App load = new App(buttonClicked.getUserData()); //button clicked could tb1 or tb2 
       load.installApp(); 
       load.launchApp(); 

      }else{ 
       System.out.println("OFF"); 
       /*how can I acces togglebutton userdata here. 
       *I would like to pass it as arguement to this class object.*/ 
       App load = new App(buttonClicked.getUserData()); 
       load.unInstallApp(); 
      } 
     } 
    }; 

    tb1.selectedProperty().addListener(clt1); 

    tb2.selectedProperty().addListener(clt1); 

} 
+1

[mcve]を作成し、問題を表示してください。 – MBec

+0

が更新しました。 –

答えて

1

いくつかのオプションがあります。

オプション1:コレクションにToggleButton秒を収集し、リスナーに直接参照を使用します。

List<ToggleButton> toggles = new ArrayList<>(Arrays.asList(tb1, tb2)); 

for(ToggleButton toggle:toggles) 
    toggle.selectedProperty().addListener((observable, oldValue, newValue) -> 
     System.out.println(toggle.getText() + " - Selected: " + toggle.isSelected() + "; UserData: " + toggle.getUserData())); 

オプション2:あなたはonActionPropertyを使用することができます。

tb1.setOnAction(e -> { 
    ToggleButton toggle = (ToggleButton) e.getSource(); 
    System.out.println(toggle.getText() + " - Selected: " + toggle.isSelected() 
      + "; UserData: " + toggle.getUserData()); 
}); 

オプション3:リスナーを格納する必要がある場合は、ChangeListenerを実装することができます。このSSCEで

public class Toggles extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     VBox vBox = new VBox(); 
     for (int i = 0; i < 20; i++) { 
      ToggleButton tb = new ToggleButton("ToggleButton" + i); 
      tb.setUserData("UserData" + i); 
      tb.selectedProperty().addListener(new ToggleButtonSourcedChangeListener(tb)); 
      vBox.getChildren().add(tb); 
     } 

     Scene scene = new Scene(new BorderPane(vBox), 320, 240); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private abstract static class SourcedChangeListener<T extends Node> implements ChangeListener<Boolean> { 
     T source; 

     SourcedChangeListener(T source) { 
      this.source = source; 
     } 
    } 

    private static class ToggleButtonSourcedChangeListener extends SourcedChangeListener<ToggleButton> { 

     ToggleButtonSourcedChangeListener(ToggleButton source) { 
      super(source); 
     } 

     @Override 
     public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
      System.out.println(source.getText() + " - Selected: " + source.isSelected() 
        + "; UserData: " + source.getUserData()); 
     } 
    } 
} 

私は具体的な実装によって拡張することができ抽象SourceChangeListenerを作成しました。ジェネリックパラメータ<T extends Node>の背後にある意図は、キャストを避けることです。

あなたはこのコードを実行し、トグルをクリックすると、出力は次のようになります:onActionPropertyはボタンだった場合にのみ変更されますと、私はselectedPropertyを使用するのいずれかのオプションを提案する

ToggleButton4 - Selected: true; UserData: UserData4 
ToggleButton5 - Selected: true; UserData: UserData5 
ToggleButton4 - Selected: false; UserData: UserData4 
ToggleButton8 - Selected: true; UserData: UserData8 
ToggleButton5 - Selected: false; UserData: UserData5 
ToggleButton2 - Selected: true; UserData: UserData2 

(マウス、タッチまたはキーで)またはプログラムでfire()メソッドを呼び出した場合は、選択した状態をプログラマチックに変更した場合でも、他の2つのオプションは常に機能します。

+0

それらのすべてが動作します...ありがとうございました。 –

+0

トグルへの参照を保持する必要はありません。選択されたプロパティは他のものと同じように、プロパティの所有者であるフィールドBeanを持っています。そしてonActionに対して強くアドバイスします、あなたはすでに理由を述べました:-) – kleopatra

関連する問題