【问题标题】:javafx checkbox clicked while key pressed will not change state按下键时单击 javafx 复选框不会改变状态
【发布时间】:2021-10-06 10:13:54
【问题描述】:

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

在 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);
    }

}

任何帮助将不胜感激。

【问题讨论】:

  • 如果您检查ButtonBehavior 类,您会发现一个名为keyDown 的布尔值。他们提到了这一点:只要 keyDown 为真,我们也会被武装,并将忽略与武装相关的鼠标事件。

标签: javafx checkbox keyevent


【解决方案1】:

改进solution offered by etuygar

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

【讨论】:

  • 为什么不使用checkbox.fire() 而不是checkbox.setSelected(! checkbox.isSelected());?如果CheckBox 允许indeterminate 状态,手动切换状态不会显示预期的行为。
  • @MissChanandlerBong checkbox.fire() 确实是一个更好的选择。谢谢。
【解决方案2】:

你可以这样做。

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

}

【讨论】:

  • 您可能希望将setOnMouseClicked 添加到场景中以检测 键是否按下,以防它在checkbox 之外被按下。也不需要保存CheckBox 的最后状态。您可以通过checkbox.setSelected(! checkbox.isSelected()); 切换它
  • 或者更好的是checkbox.fire() @MissChanandlerBong 建议
【解决方案3】:

非常感谢@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);
    }
}

【讨论】:

  • 在按下另一个键时阻止动作是默认行为,所以我认为实现 CheckBox Behavior 是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多