2017-02-23 50 views
1

我有这样的代码的ToggleButtons和听众在JavaFX的

@FXML 
private ToggleButton tb1; 
@FXML 
private ToggleButton tb2; 
@FXML 
ToggleGroup group = new ToggleGroup(); 

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

@FXML 
private void onToggleClick(){ 

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

    ChangeListener<Toggle> cLt = new ChangeListener<Toggle>(){ 
     public void changed(ObservableValue<? extends Toggle> ov, 
       Toggle toggle, Toggle new_toggle){ 
      if (new_toggle != null){ 
       System.out.println(group.getSelectedToggle().getUserData().toString()); 

      }else{ 
       System.out.println("hello no"); 
      } 
     } 
    }; 

    group.selectedToggleProperty().addListener(cLt); 

} 

虽然我还没有使用的用户数据,事情是,每当我点击切换按钮,我得到所需的输出递增的顺序。

这里是输出:

hello no             //click2 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk //click3 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
hello no             //click4 
hello no 
hello no 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk //click5 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
hello no             //click6 
hello no 
hello no 
hello no 
hello no 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk //click7 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 
D:/myWorkspace/TestAttacks/input_folder/app_debug.apk 

在第一次点击我什么也没得到。

从第二次点击我开始获得这种输出。任何人都可以解释这种行为并为我提供解决方案吗?

回答

2

onToggleClick方法的所有代码应该转到控制器的initialize方法。

现在,在第一个切换点击时,您将ToggleButton的数据设置为组,然后将您的收听者设置为ToggleGroup。 因此,此侦听器仅在第二次切换点击时执行,您可以在其中再次设置数据,甚至更糟 - 您将添加一个额外的侦听器。

在第三次单击时,这两个侦听器将被执行,并且您将添加另一个侦听器......因此,在控制台上打印不断增加的“... .apk”列表。

所有这些操作在创建所有节点后应该只发生一次:这个地方是控制器的initialize方法。


如果你想有独立ToggleButton S,根本不把ToggleButton s转换为ToggleGroup,然后您可以单独听切换的selectedProperty

ToggleButton tb1 = new ToggleButton("ToggleButton1"); 
ToggleButton tb2 = new ToggleButton("ToggleButton2"); 

tb1.selectedProperty().addListener(((observable, oldValue, newValue) -> { 
    System.out.println(tb1.getText() + " changed from " + oldValue + " to " + newValue); 
    System.out.println("Taking a nap!"); 
})); 

tb2.selectedProperty().addListener(((observable, oldValue, newValue) -> { 
    System.out.println(tb2.getText() + " changed from " +oldValue + " to " + newValue); 
    System.out.println("Working hard!"); 
})); 

另外,您也可以使用onActionProperty

for (int i = 0; i< 20; i++) { 
    ToggleButton tb = new ToggleButton("ToggleButton"+i); 
    tb.setUserData("UserData"+i); 
    tb.setOnAction(e -> { 
     System.out.println(tb.getText() + " - Selected: " + tb.isSelected() 
      + "; UserData: " + tb.getUserData()); 
    }); 
} 
+0

Thanks.:)..It工作...你能告诉我怎么才能访问userdat后,我点击/切换按钮从关模式的on模式。 –

+0

在你的监听器中,'new_toggle'包含在组中选择的切换。如果它为空,则表示没有选择切换(当前选定的切换关闭)。 – DVarga

+0

如果点击另一个切换按钮,则一个切换按钮btn1(打开)的状态发生变化(关闭)。为什么?。如何管理这个。 –