按下按键时单击 javafx 复选框不会更改状态

javafx checkbox clicked while key pressed will not change state

我有一个非常简单的问题,在任何其他帖子中都找不到:

在 javafx15 / java15.0.1 中,我试图在按下 CONTROL 键的同时单击一个复选框...状态没有改变。

我试图抓住按键(在复选框上有一个按键事件),我确实抓住了按下的控制键...但是如果同时按下一个键,复选框的状态不会改变。

如何让它以透明的方式工作?

这是一个最基本的简单代码来说明问题:

package checkboxkeypressed;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.stage.Stage;

public class CheckboxWhileKeyPressedNotWorking extends Application {

    private CheckBox checkbox = new CheckBox();

    @Override
    public void start(Stage primaryStage) {
        checkbox.setText("Click me while pressing a key...");
        Scene scene = new Scene(checkbox, 200, 50);

        primaryStage.setTitle("Checkbox cannot be ticked while a key is pressed !!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

如有任何帮助,我们将不胜感激。

你可以这样做。

package checkboxkeypressed;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;

public class CheckboxWhileKeyPressedNotWorking extends Application {

private CheckBox checkbox = new CheckBox();

private boolean ctrlOk, lastState;

@Override
public void start(Stage primaryStage) {
    
    checkbox.setText("Click me while pressing a key...");
    Scene scene = new Scene(checkbox, 200, 50);

    scene.setOnKeyPressed(event -> {
        if (event.getCode() == KeyCode.CONTROL) ctrlOk = true;      
    });

    
    
    scene.setOnKeyReleased(event -> {
        if (event.getCode() == KeyCode.CONTROL) ctrlOk = false;     
    });

    
    
    checkbox.setOnMouseClicked(event -> {
        
        if (!ctrlOk) {
            checkbox.setSelected(lastState);
        } else {
            checkbox.setSelected(!checkbox.isSelected());
            lastState = checkbox.isSelected();
        }

    });
    
    

    primaryStage.setTitle("Checkbox cannot be ticked while a key is pressed !!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}

}

非常感谢@miss-chanandler-bong!

那么这个答案可以吗?我强制启用复选框,当启用正在更改时...

package checkboxkeypressed;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

public class CheckboxWhileKeyPressed extends Application {

    private CheckBox checkbox = new CheckBox();

    @Override
    public void start(Stage primaryStage) {
        checkbox.setText("Click me while pressing a key...");

        checkbox.armedProperty().addListener(changeListener -> checkbox.arm());
        checkbox.arm();
        checkbox.setOnKeyPressed(keyEvent -> processKeyPressed(keyEvent));
        Scene scene = new Scene(checkbox, 200, 50);

        primaryStage.setTitle("Checkbox CAN NOW be ticked while a key is pressed !!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void processKeyPressed(KeyEvent keyEvent) {
        if (keyEvent.getCode().equals(KeyCode.CONTROL)) {
            System.out.println("Key IS control");
        } else {
            System.out.println("Key IS NOT control : '" + keyEvent.getCode().getName() + "'");
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

改进

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.stage.Stage;

public class CheckboxWhileKeyPressedNotWorking extends Application {

    private final CheckBox checkbox = new CheckBox();
    private boolean isControlKeyDown = false;

    @Override
    public void start(Stage primaryStage) {

        checkbox.setText("Click me while pressing <CNTRL> key");
        checkbox.setOnMouseClicked(e->{
            if(isControlKeyDown){
                checkbox.fire(); //change check box state
            }
        });

        Scene scene = new Scene(checkbox, 300, 50);
        scene.setOnKeyPressed(keyEvent -> {
            isControlKeyDown = keyEvent.isControlDown();
        });

        scene.setOnKeyReleased(keyEvent -> {
            isControlKeyDown = keyEvent.isControlDown();
        });

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}