java - JavaFX 中的切换按钮和监听器

标签 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

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

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

最佳答案

onToggleClick 方法中的所有代码都应转到 Controller 的 initialize 方法。

现在,在第一次切换时单击,为 ToggleButton 设置数据并将它们放入组中,然后在 ToggleGroup 上设置监听器。 因此,此监听器仅在第二次切换单击时执行,您再次设置数据,并且 - 更糟糕的是 - 您添加了一个额外的监听器。

第三次单击时,这两个监听器将被执行,然后您添加另一个监听器...因此控制台上会打印越来越多的“....apk”列表。

所有这些操作都应该只发生一次,在所有节点创建之后:这个地方是 Controller 的 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());
    });
}

关于java - JavaFX 中的切换按钮和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42413313/

相关文章:

java - JAVA中按钮VS图像按钮

android - android中监听器和接口(interface)的区别?

JavaScript、jQuery : How to re-listen for click events

java - 编写可使用 Set 属性转换为 Java 的 xml 模式

java - java中自定义链接列表的自定义值类

java - 读取 JavaFX Canvas 像素的最佳方法是什么?

java - 用于插入到 sql : event handler is not in the Namespace or there is an error in the script 的按钮

java - JInternalFrame底部阴影问题

Java swing,元素在添加新元素后回到其初始位置

JavaFX valueAt() 绑定(bind)仅计算一次