2015-07-12 1 views
0

Например, я создал кнопку с надписью «1». Всякий раз, когда эта кнопка нажата, 1 добавляется к текстовому полю. Тем не менее, я могу добавить 1 в textField, просто набрав 1 на моей клавиатуре. При этом я хотел бы, чтобы кнопка нажала кнопку, чтобы получить представление, как если бы оно было нажато, а если ключ. Я думал Тан может быть, что можно справиться с этой проблемой следующим образом:Как сделать кнопку нажатой, когда нажата соответствующая клавиша на клавиатуре? JavaFX

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(); 
     } 
    }); 
+0

возможно дубликат: http://stackoverflow.com/questions/4753004/how-do-i-programatically-send-actionevent-to-jbutton –

+1

@BhavikPatel Это JavaFX и не свинг , – NwDev

+0

Вызов 'button.setPressed (true);' не работает? –

ответ

0

Использование 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); 
    } 
}