【问题标题】:How make a button pressed when corresponding key on a keyboard is pressed? JavaFX按下键盘上的相应键时如何按下按钮? JavaFX
【发布时间】:2015-10-01 00:57:12
【问题描述】:

例如,我创建了一个标记为“1”的按钮。每当按下此按钮时,都会将 1 附加到 textField。但是,我只需在键盘上键入 1 即可将 1 添加到 textField 中。这样做时,我希望通过按钮获得视图,就好像它被按下而不是按键一样。 我一直在想,也许可以通过这种方式来解决这个问题:

   rootNode.setOnKeyTyped(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            textField.appendText(event.getCharacter());
            if(event.getCharacter().equals("1")){
                // here button should be pressed
            }
        }
    });

有什么方法可以改变按钮的外观吗? 提前谢谢。

@James_D,您的程序可以正常工作,但我不会将您的解决方案应用于我的程序。也许是因为我定制了我的按钮。看看我的代码的一部分:

    HashMap<String, Button> buttons = new HashMap<>();
    int btnVal = 1;
    for(int j = 5 ; j >= 3; j --){
    for(int i = 1; i <= 3; i ++){
       Button btn = createNumberButton(Integer.toString(btnVal++), inputField, i, j);
       rootNode.getChildren().add(btn);
       buttons.put(Integer.toString(btnVal), btn);
       }
    }
    rootNode.setOnKeyPressed(event -> {
        Button btn = buttons.get(event.getText());
        if (btn != null) {
            System.out.println(event.getText());
            btn.arm();
            inputField.appendText(event.getText());
        }
    });

    rootNode.setOnKeyReleased(event -> {
        Button btn = buttons.get(event.getText());
        if (btn != null) {
            btn.disarm();
        }
    });

【问题讨论】:

  • @BhavikPatel 这是 JavaFX 而不是 Swing。
  • 呼叫button.setPressed(true); 不起作用?
  • 如果我的理解是正确的,您想制作在您的文本字段中输入相同文本的键吗?像 A, B, C -> text.append(A, B, C),但是一个按钮会显示按下的动作?
  • @James_D ,Button 中没有这种方法。

标签: java events button javafx handler


【解决方案1】:

使用button.arm()(和button.disarm()“释放”它)。

SSCCE:

import java.util.HashMap;
import java.util.Map;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class PressButtonOnTyping extends Application {

    @Override
    public void start(Stage primaryStage) {

        GridPane root = new GridPane();
        TextField textField = new TextField();
        textField.setDisable(true);

        root.add(textField, 0, 0, 3, 1);

        Map<String, Button> buttons = new HashMap<>();

        for (int i = 1 ; i <= 9; i++) {
            Button button = createButton(i, textField);
            buttons.put(Integer.toString(i), button);
            root.add(button, (i-1)%3, 1+ (i-1) / 3);
        }
        Button zeroButton = createButton(0, textField);
        root.add(zeroButton, 1, 4);
        buttons.put("0", zeroButton);

        root.setOnKeyPressed(e -> {
            Button button = buttons.get(e.getText());
            if (button!=null) {
                button.arm();
                textField.appendText(e.getText());
            }
        });

        root.setOnKeyReleased(e -> {
            Button button = buttons.get(e.getText());
            if (button!=null) {
                button.disarm();
            }           
        });

        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    private Button createButton(int value, TextField target) {
        String s = Integer.toString(value);
        Button button = new Button(s);
        button.setOnAction(e -> target.appendText(s));
        return button ;
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2019-11-19
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2013-02-25
    • 2017-01-31
    相关资源
    最近更新 更多