JavaFX中的切换按钮和侦听器

JavaFX中的切换按钮和侦听器,java,javafx,listener,togglebutton,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/

我有这个密码

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

}
在第一次点击中,我什么也得不到


从第二次单击开始,我就开始获得这种输出。有人能解释一下这种行为并为我提供解决方案吗?

所有来自
ontogleclick
方法的代码都应该转到控制器的
initialize
方法

现在,在第一次切换时,单击为
ToggleButton
s设置数据并将其放入组中,然后在
ToggleGroup
上设置侦听器。 所以这个监听器只会在第二次切换点击时执行,在这里您再次设置了数据,更糟糕的是,您添加了一个额外的监听器

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

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


如果您想拥有独立的
ToggleButton
s,只需不要将
ToggleButton
s放入
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!");
}));
或者,您也可以使用

for(int i=0;i<20;i++){
ToggleButton tb=新的ToggleButton(“ToggleButton”+i);
tb.setUserData(“UserData”+i);
tb.设置动作(e->{
System.out.println(tb.getText()+“-选中:“+tb.isSelected())
+“用户数据:”+tb.getUserData());
});
}

谢谢。…它起作用了。。。您还可以告诉我,在我从关闭模式单击/切换按钮到打开模式后,如何访问userdat。在您的侦听器中,切换包含在组中选中的切换。如果为空,则表示未选择任何切换(当前选择的切换已关闭)。如果单击另一个切换按钮,则一个切换按钮btn1(打开)的状态将更改(关闭)。为什么?如何管理。因为您将
ToggleButton
s放置在
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!");
}));
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());
    });
}