JavaFX中的ToggleButtons和侦听器

时间:2017-02-23 10:38:41

标签: java javafx listener togglebutton

我有这段代码

@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

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

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

1 个答案:

答案 0 :(得分:2)

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

现在,在第一个切换点击时,您可以设置ToggleButton的数据并将它们放入组中,然后在ToggleGroup上设置监听器。 所以这个监听器只会在第二次切换点击时执行,你再次设置数据,甚至更糟 - 你添加了一个额外的监听器。

在第三次点击时,这两个听众将被执行,你又添加了一个......因此,不断增长的&#34; ... .apk&#34;在控制台上打印。

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

如果您希望拥有独立的ToggleButton,只需将ToggleButton放入ToggleGroup,然后您就可以收听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!"); })); 的{​​{1}}了单独切换:

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());
    });
}

或者您也可以使用selectedProperty

Branch::with('users.books')->orderBy('name','asc')->get();