当前位置: 首页 > 面试题库 >

JavaFX中的ToggleButtons和侦听器

艾嘉石
2023-03-14
问题内容

我有这个代码

@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并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 嗨,我有一个很可能很愚蠢的问题。我刚开始玩弄属性和ChangeListener,但遇到了一个障碍。我知道,如果我创建了一个包含数组列表的对象属性,那么只有当数组列表本身发生变化时,任何ChangeListener才会启动。但是,如果出现以下情况,我希望所有ChangeListener都启动 阵列列表本身会更改 数组列表的长度会更改(即添加或删除元素) 将ArrayList中的元素更改为其他元素 数

  • 问题说明:

  • 问题内容: 我想一种添加到我当过用户更改的,它的值,应用程序在控制台上打印的东西。 我进行了搜索,发现以下非常相似的问题:JTextField的值更改侦听器 提到的问题的答案非常清楚和有效,但是不幸的是,它仅对(Not )有用,因为它说您应该像这样使用DocumentListener: 但是在JavaFX的TextField中,您无法执行此操作。所以?解决办法是什么? (使用代码进行描述可能会很好

  • 我需要一些帮助。我有一个s的。 我想检查值是否发生了变化。如果是,我想知道它是哪个文本字段。我知道我可以使用侦听器来执行此操作,但这只适用于单个侦听器。 我希望它在数组上工作并确定哪个文本字段已更改。 提前感谢!

  • 如果我向JavaFx属性添加onChange侦听器, 监听器是按顺序调用的吗?如果我有一个字符串属性,然后我把字符串转到“爱丽丝”,然后转到“鲍勃”,我保证在看到“鲍勃”之前看到“爱丽丝”吗?事实上,我不在乎我是否看到“爱丽丝”,只要我看不到“鲍勃”之后 监听器是按顺序调用的吗?我的监听器有可能同时被“爱丽丝”和“鲍勃”通知调用吗?