【问题标题】:ToggleButtons and listeners in JavaFXJavaFX 中的切换按钮和侦听器
【发布时间】:2017-07-13 18:58:24
【问题描述】:

我有这个代码

@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

第一次点击我什么都没有。

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

【问题讨论】:

    标签: java javafx listener togglebutton


    【解决方案1】:

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

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

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

    所有这些动作都应该只发生一次,在所有节点创建之后:这个地方是控制器的initialize方法。


    如果你想拥有独立的ToggleButtons,干脆不要把ToggleButtons放到ToggleGroup中,然后你可以单独收听toggles的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());
        });
    }
    

    【讨论】:

    • 谢谢。:)..它起作用了...您能否告诉我在单击/切换按钮从关闭模式到开启模式后如何访问 userdat。
    • 在您的听众new_toggle 中包含在组中被选中的切换。如果为null,则表示没有选择toggle(当前选择的toggle是关闭的)。
    • 如果单击另一个切换按钮,则一个切换按钮 btn1(打开)的状态会更改(关闭)。为什么?。如何管理。
    • 因为您将ToggleButtons 放在了ToggleGroup 中。这正是该组所做的:只能同时打开一个切换开关,这将是该组的选定切换开关。如果您想要独立切换,只需不要将它们分组,并一个接一个地聆听它们的变化。
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2017-07-14
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多