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

}

尽管我仍未使用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。因此,仅在第二次切换单击时执行此侦听器,在此您再次设置数据,甚至更糟的是,添加了另一个侦听器。

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

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


如果您想拥有独立ToggleButton的,只需将ToggleButtons放到中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());

});

}

以上是 JavaFX中的ToggleButtons和侦听器 的全部内容, 来源链接: utcz.com/qa/411917.html

回到顶部