JavaFX 中的切换按钮和监听器
ToggleButtons and listeners in 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
第一次点击什么都没有。
从第二次点击开始,我开始得到这种输出。任何人都可以解释这种行为并为此提供解决方案吗?
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());
});
}
我有这个代码
@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
第一次点击什么都没有。
从第二次点击开始,我开始得到这种输出。任何人都可以解释这种行为并为此提供解决方案吗?
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());
});
}