Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当按下键盘上相应的键时,如何使按钮被按下?JavaFX_Java_Events_Button_Javafx_Handler - Fatal编程技术网

当按下键盘上相应的键时,如何使按钮被按下?JavaFX

当按下键盘上相应的键时,如何使按钮被按下?JavaFX,java,events,button,javafx,handler,Java,Events,Button,Javafx,Handler,例如,我创建了一个标记为“1”的按钮。无论何时按下此按钮,文本字段都会追加1。但是,我只需在键盘上键入1,就可以将1添加到文本字段中。当这样做的时候,我希望通过按钮来获取视图,就好像按下了一个键一样。 我一直在想,也许可以用这种方式处理这个问题: rootNode.setOnKeyTyped(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent event) {

例如,我创建了一个标记为“1”的按钮。无论何时按下此按钮,文本字段都会追加1。但是,我只需在键盘上键入1,就可以将1添加到文本字段中。当这样做的时候,我希望通过按钮来获取视图,就好像按下了一个键一样。 我一直在想,也许可以用这种方式处理这个问题:

   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
            }
        }
    });
rootNode.setOnKeyTyped(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
textField.appendText(event.getCharacter());
if(event.getCharacter().equals(“1”)){
//这里的按钮应该按下
}
}
});
有什么方法可以改变按钮的外观吗? 谢谢是预付款

@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();
        }
    });
HashMap按钮=新建HashMap();
int btnVal=1;
对于(int j=5;j>=3;j--){
对于(int i=1;i{
Button btn=buttons.get(event.getText());
如果(btn!=null){
System.out.println(event.getText());
btn.arm();
appendText(event.getText());
}
});
rootNode.setOnKeyReleased(事件->{
Button btn=buttons.get(event.getText());
如果(btn!=null){
btn.解除武装();
}
});
使用
按钮.防护()
(和
按钮.解除防护()
来“释放”它)

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);
    }
}
import java.util.HashMap;
导入java.util.Map;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.GridPane;
导入javafx.stage.stage;
公共类PressButton非类型化扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
GridPane root=新的GridPane();
TextField TextField=新的TextField();
textField.setDisable(true);
添加(textField,0,0,3,1);
映射按钮=新建HashMap();
对于(int i=1;i{
Button-Button=buttons.get(如getText());
如果(按钮!=null){
按钮。手臂();
appendText(例如getText());
}
});
root.setOnKeyReleased(e->{
Button-Button=buttons.get(如getText());
如果(按钮!=null){
按钮。解除武装();
}           
});
原始阶段。设置场景(新场景(根,400400));
primaryStage.show();
}
私有按钮createButton(int值,TextField目标){
字符串s=整数.toString(值);
按钮=新按钮;
设置操作(e->target.appendText);
返回按钮;
}
公共静态void main(字符串[]args){
发射(args);
}
}

可能重复:@bhaviktatel这是JavaFX,不是Swing。调用
按钮。setPressed(true);
不起作用?如果我理解你的意思是正确的,你想在文本字段中输入相等文本的键吗?比如A,B,C->text.append(A,B,C),但按钮会显示按下的动作?@James_D,按钮中没有这种方法。