setText() в двух текстовых полях, в зависимости от того, где пользователь нажал на

#java #javafx

#java #javafx

Вопрос:

У меня есть задание, в котором я должен создать функциональный калькулятор с использованием JavaFX. Нам нужно создать 3 текстовых поля, одно для первого числа, одно для второго числа и одно для результата. Я почти закончил. но как мне заставить программу вставить PI в текстовое поле, редактируемое пользователем? это мой код: пожалуйста, помогите

 public class Calculator extends Application{
    double ans;
    int t=6;
 @Override
 public void start(Stage primaryStage){
 GridPane pane = new GridPane();
 pane.setHgap(10);
 pane.setVgap(10);
 pane.setAlignment(Pos.CENTER);
 pane.setPadding(new Insets(10, 10, 10, 10));

 HBox hbox = new HBox();
 TextField t1 = new TextField();
 TextField t2 = new TextField();
 TextField t3 = new TextField();
 
 if(t1.getText().length() > 5){
     t1.setText(t1.getText().substring(0, t));
     t3.setText("Error! maximum 5 digits");
 }
 
 hbox.setAlignment(Pos.TOP_CENTER);

 
 Button b1 = new Button("AC"); b1.setAlignment(Pos.CENTER); pane.add(b1,0,3);
 Button b2 = new Button("PI");b2.setAlignment(Pos.CENTER); pane.add(b2,1,3);
 Button b3 = new Button("Sqrt");b3.setAlignment(Pos.CENTER);pane.add(b3,2,3);
 Button b4 = new Button("DEL");b4.setAlignment(Pos.CENTER);pane.add(b4,3,3);
 Button b5 = new Button("7");b4.setAlignment(Pos.CENTER);pane.add(b5,0,4);
 Button b6 = new Button("8");b6.setAlignment(Pos.CENTER);pane.add(b6,1,4);
 Button b7 = new Button("9");b7.setAlignment(Pos.CENTER);pane.add(b7,2,4);
 Button b8 = new Button("/");b8.setAlignment(Pos.CENTER);pane.add(b8,3,4);
 Button b9 = new Button("4");b9.setAlignment(Pos.CENTER);pane.add(b9,0,5);
 Button b10 = new Button("5");b10.setAlignment(Pos.CENTER);pane.add(b10,1,5);
 Button b11 = new Button("6");b11.setAlignment(Pos.CENTER);pane.add(b11,2,5);
 Button b12 = new Button("*");b12.setAlignment(Pos.CENTER);pane.add(b12,3,5);
 Button b13 = new Button("1");b13.setAlignment(Pos.CENTER);pane.add(b13,0,6);
 Button b14 = new Button("2");b14.setAlignment(Pos.CENTER);pane.add(b14,1,6);
 Button b15 = new Button("3");b15.setAlignment(Pos.CENTER);pane.add(b15,2,6);
 Button b16= new Button("-");b16.setAlignment(Pos.CENTER);pane.add(b16,3,6);
 Button b17 = new Button("=");b17.setAlignment(Pos.CENTER);pane.add(b17,0,7);
 Button b18 = new Button("0");b18.setAlignment(Pos.CENTER); pane.add(b18,1,7);
 Button b19 = new Button(".");b19.setAlignment(Pos.CENTER);pane.add(b19,2,7);
 Button b20 = new Button(" ");b20.setAlignment(Pos.CENTER);pane.add(b20,3,7);
 
 
 b1.setOnAction((ActionEvent e) -> {
     t1.setText("");
     t2.setText("");
     t3.setText("");
 }); 
 b4.setOnAction((ActionEvent e) -> {
     t3.setText("");
 }); 
 b3.setOnAction((ActionEvent e) -> {
     ans=(Math.sqrt(Double.parseDouble(t1.getText())));
     t3.setText(ans   "");
 }); 
   b20.setOnAction((ActionEvent e) -> {
       ans=Double.parseDouble(t1.getText())  Double.parseDouble(t2.getText());
       t3.setText(ans   "");
 }); 
    b16.setOnAction((ActionEvent event) -> {
        ans=Double.parseDouble(t1.getText()) - Double.parseDouble(t2.getText());
        t3.setText(ans   "");
 }); 
b12.setOnAction((ActionEvent event) -> { 
    ans=Double.parseDouble(t1.getText()) * Double.parseDouble(t2.getText());
    t3.setText(ans   "");
 }); 
b8.setOnAction((ActionEvent event) -> { 
    ans=Double.parseDouble(t1.getText()) /Double.parseDouble(t2.getText());
    t3.setText(ans   "");
 }); 


b2.setOnAction((ActionEvent event) -> {
    ans= (Math.PI);
   
    if(t1.isFocused()){
    t1.setText(String.valueOf(ans));}
    else if(t2.isFocused()){
        t2.setText(String.valueOf(ans));
    }
 }); 

/*
t1.setOnMouseClicked((event) -> {
    if(b2.isPressed()){
    ans= (Math.PI);
    t1.setText(String.valueOf(ans));}
 }); 
t2.setOnMouseClicked((event) -> {
    if(b2.isPressed()){
    ans= (Math.PI);
    t2.setText(String.valueOf(ans));}
 }); 
*/
 

 hbox.getChildren().addAll(t1,t2,t3);
 BorderPane bp = new  BorderPane();
 bp.setTop(hbox);
 bp.setCenter(pane);
 Scene scene = new Scene(bp);
 primaryStage.setTitle("Nora's Functional Calculator");
 primaryStage.setScene(scene);
 primaryStage.show();
 }
 
 public static void main(String[] args) {
launch (args);
 }
}
  

Ответ №1:

Добавьте что-нибудь, чтобы отследить, какое поле в последний раз было в фокусе. Поле:

     private TextField lastFocused;
  

И некоторые слушатели:

         t1.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean lost, Boolean gained) -> {
            if (gained) {
                lastFocused = t1;
            }
        });
        t2.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean lost, Boolean gained) -> {
            if (gained) {
                lastFocused = t2;
            }
        });
  

Затем вы можете просто установить текст в последнем сфокусированном поле:

             if (lastFocused != null) {
                lastFocused.setText(String.valueOf(ans));
            }
  

Вы также можете инициализировать lastFocused на t1 и автоматически переключаться между t1 и t2 всякий раз, когда вы устанавливаете значение. Сделайте текстовые поля переменными-членами и используйте метод для ввода в правильное поле:

     private void setTextOfLastFocusedField(String val) {
        if (lastFocused != null) {
            lastFocused.setText(val);
        }
        if (lastFocused == t1) {
            lastFocused = t2;
        } else {
            lastFocused = t1;
        }
    }
  

Комментарии:

1. привет @swpalmer пожалуйста, пожалуйста, дайте вам идентификатор Twitter.