#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.