2014-04-01 14 views
0

매우 기본적인 JavaFX 계산기를 만들려고합니다.하지만 백 스페이스를 구현하는 방법이 확실하지 않습니다.계산기 용 JavaFX에서 백 스페이스 버튼 만들기

private void makeBackspaceButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      value.set(value.get()); 
     } 
    }); 

} 

나는 마지막으로 입력 한 값을 제거하는 방법을 생각할 수 없다. 따라서 값 89를 입력하면 마지막 숫자 (9) 만 제거됩니다. 이 형식으로 사용하거나 형식을 변경해야합니까? 전체 코드가 아래에 있지만 아직 완료되지 않았습니다.

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.*; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

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

// a simple JavaFX calculator. 
public class Calcy extends Application { 

//implementing the template if how i would like the buttons to look like 
private static final String[][] template = { 
    {"c", "%", "√", "←"}, 
    {"7", "8", "9", "/"}, 
    {"4", "5", "6", "*"}, 
    {"1", "2", "3", "-"}, 
    {"0", ".", "=", "+"} 
}; 

private final Map<String, Button> accelerators = new HashMap<>(); 


private DoubleProperty stackValue = new SimpleDoubleProperty(); 
private DoubleProperty value = new SimpleDoubleProperty(); 

private enum Op { 

    NOOP, ADD, SUBTRACT, MULTIPLY, DIVIDE 
} 

private Op curOp = Op.NOOP; 
private Op stackOp = Op.NOOP; 

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

@Override 
public void start(Stage stage) { 
    final TextField screen = createScreen(); 
    final TilePane buttons = createButtons(); 

    stage.setTitle("Thank goodness for a calculator!"); 
    stage.initStyle(StageStyle.UTILITY); 
    stage.setResizable(false); 
    stage.setScene(new Scene(createLayout(screen, buttons))); 
    stage.show(); 
} 

private VBox createLayout(TextField screen, TilePane buttons) { 
    final VBox layout = new VBox(20); 
    layout.setAlignment(Pos.CENTER); 
    layout.setStyle("-fx-background-color: floralwhite; -fx-padding: 20; -fx-font-size: 20;"); 
    layout.getChildren().setAll(screen, buttons); 
    handleAccelerators(layout); 
    screen.prefWidthProperty().bind(buttons.widthProperty()); 
    return layout; 
} 

private void handleAccelerators(VBox layout) { 
    layout.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent keyEvent) { 
      Button activated = accelerators.get(keyEvent.getText()); 
      if (activated != null) { 
       activated.fire(); 
      } 
     } 
    }); 
} 

private TextField createScreen() { 
    final TextField screen = new TextField(); 
    screen.setStyle("-fx-background-color: lightgrey;"); 
    screen.setAlignment(Pos.CENTER_RIGHT); 
    screen.setEditable(false); 
    screen.textProperty().bind(Bindings.format("%.2f", value)); 
    return screen; 
} 

private TilePane createButtons() { 
    TilePane buttons = new TilePane(); 
    buttons.setVgap(7); 
    buttons.setHgap(7); 
    buttons.setPrefColumns(template[0].length); 
    for (String[] r : template) { 
     for (String s : r) { 
      buttons.getChildren().add(createButton(s)); 
     } 
    } 
    return buttons; 
} 

private Button createButton(final String s) { 
    Button button = makeStandardButton(s); 

    if (s.matches("[0-9]")) { 
     makeNumericButton(s, button); 
    } else { 
     final ObjectProperty<Op> triggerOp = determineOperand(s); 
     if (triggerOp.get() != Op.NOOP) { 
      makeOperandButton(button, triggerOp); 
     } else if ("c".equals(s)) { 
      makeClearButton(button); 
     } else if ("=".equals(s)) { 
      makeEqualsButton(button); 
     } else if ("←".equals(s)) { 
      makeBackspaceButton(button); 
     } else if ("%".equals(s)) { 
      makePercentageButton(button); 
     } else if ("√".equals(s)) { 
      makeSquarerootButton(button); 
     } else if (".".equals(s)) { 
      makePointButton(button); 
     } 
    } 

    return button; 
} 

private ObjectProperty<Op> determineOperand(String s) { 
    final ObjectProperty<Op> triggerOp = new SimpleObjectProperty<>(Op.NOOP); 
    switch (s) { 
     case "+": 
      triggerOp.set(Op.ADD); 
      break; 
     case "-": 
      triggerOp.set(Op.SUBTRACT); 
      break; 
     case "*": 
      triggerOp.set(Op.MULTIPLY); 
      break; 
     case "/": 
      triggerOp.set(Op.DIVIDE); 
      break; 
     case "%": 

    } 
    return triggerOp; 
} 

private void makeOperandButton(Button button, final ObjectProperty<Op> triggerOp) { 
    button.setStyle("-fx-base: ivory;"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      curOp = triggerOp.get(); 
     } 
    }); 
} 

private Button makeStandardButton(String s) { 
    Button button = new Button(s); 
    button.setStyle("-fx-base: ivory;"); 
    accelerators.put(s, button); 
    button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 
    return button; 
} 

private void makeNumericButton(final String s, Button button) { 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      if (curOp == Op.NOOP) { 
       value.set(value.get() * 10 + Integer.parseInt(s)); 
      } else { 
       stackValue.set(value.get()); 
       value.set(Integer.parseInt(s)); 
       stackOp = curOp; 
       curOp = Op.NOOP; 
      } 
     } 
    }); 
} 

private void makeClearButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      value.set(0); 
     } 
    }); 
} 

private void makeBackspaceButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      value.set(value.get()); 
     } 
    }); 

} 

private void makeSquarerootButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
} 

private void makePercentageButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
} 

private void makePointButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
} 

private void makeEqualsButton(Button button) { 
    button.setStyle("-fx-base: ivory;"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      switch (stackOp) { 
       case ADD: 
        value.set(stackValue.get() + value.get()); 
        break; 
       case SUBTRACT: 
        value.set(stackValue.get() - value.get()); 
        break; 
       case MULTIPLY: 
        value.set(stackValue.get() * value.get()); 
        break; 
       case DIVIDE: 
        value.set(stackValue.get()/value.get()); 
        break; 
      } 
     } 
    }); 
} 

}

답변

1

당신은 바로 백 스페이스 버튼의 액션 메소드 내에서 다음 줄을 추가 할 수 있습니다. 이것은 내가했던 정상적인 작동입니다.

그래서이가는 무슨 수를 얻기하지만, 마지막 하나는

(int)value.get()/10 

나중에, 소수 부분이

value.get() - (int)value.get()) 

에 액세스 할 수 있습니다 액세스 할 수있는 입력

button.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent actionEvent) { 
     value.set((int)value.get()/10 + 
     /** 
     * To get the decimal part 
     */ 
     value.get() - (int)value.get()); 
    } 
}); 

여전히 소수점 부분이 계산기에서 작동하지 않습니다. 이것이 끝나면 십진법의 앞과 뒤의 값을 고려하여 메서드를 변경해야합니다!

0

개인 무효 BackButtonActionPerformed (java.awt.event.ActionEvent의의 EVT) {

if (OutputTextField.getText().length()>0){ 
     StringBuffer sb = new StringBuffer(OutputTextField.getText()); 
     sb = sb.deleteCharAt(OutputTextField.getText().length()-1); 
     OutputTextField.setText(sb.toString()); 
    } 
}