JavaFX中的ToggleButtons和侦听器
我有这个代码
@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 cLt = new ChangeListener(){ public void changed(ObservableValue 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); }
虽然我仍然没有使用userdata,但事实是每当我点击切换按钮时,我都会按递增顺序获得所需的输出。
这是输出:
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
上设置监听ToggleGroup
。 因此,此侦听器将仅在第二次切换单击时执行,您可以在其中再次设置数据,并且 – 甚至更糟 – 您添加了一个额外的侦听器。
在第三次单击时,将执行这两个侦听器并添加另一个…因此,在控制台上打印的“… .apk”列表越来越多。
在创建所有节点之后,所有这些操作只应发生一次:此位置是控制器的initialize
方法。
如果你想拥有独立的ToggleButton
,只需不要将ToggleButton
放入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()); }); }
- 如何让maven在JDK中使用不同的JAXB库
- VariableDeclarationFragment节点resolveBindind()在eclipse / jdt / ast中返回null
- 无法使用Apache POI获取/设置Word文档(.doc)中的复选框值
- 使用Guava的Optional与@XmlAttribute
- 对于AWS Kinesis的KCL Java库,如何使用requestShutdown和shutdown来执行正常关闭
- Tomcat中JNDI的Java Mail API配置文档
- 使用javac和javax.tools.JavaCompiler有什么区别?
- 属性文件未使用Apache Commons Configuration反映修改的更改
- lambdas中隐含的匿名类型