magomar
2/16/2015 - 5:01 PM

Controller of the CurrencyConverterLite JavaFX app

Controller of the CurrencyConverterLite JavaFX app

package currencyconverter.app;

import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.util.converter.DoubleStringConverter;

import java.net.URL;
import java.text.DecimalFormat;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    private ComboBox<Currency> outputCurrencyComboBox;

    @FXML
    private ComboBox<Currency> inputCurrencyComboBox;

    @FXML
    private TextField outputAmount;

    @FXML
    private TextField inputAmount;

    @FXML
    private CheckBox autoCheckBoxButton;

    @FXML
    private Button convertButton;

    private final static DoubleStringConverter DOUBLE_STRING_CONVERTER = new DoubleStringConverter();

    private final static DecimalFormat CURRENCY_FORMAT = new DecimalFormat("#0.00");

    private final ObservableList<Currency> currencies = FXCollections.observableArrayList();

    private final ChangeListener<String> inputAmountChangeListener = (observable, oldValue, newValue) -> convertAction(null);

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        currencies.addAll(Currency.values());
        inputCurrencyComboBox.setItems(currencies);
        outputCurrencyComboBox.setItems(currencies);
        inputCurrencyComboBox.getSelectionModel().selectFirst();
        outputCurrencyComboBox.getSelectionModel().selectLast();
        autoCheckBoxButton.setSelected(false);

        clearAction(null);

        inputCurrencyComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
            convertAction(null);
        });
        outputCurrencyComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
            convertAction(null);
        });

    }

    @FXML
    private void convertAction(ActionEvent actionEvent) {
        Currency inputCurrency = inputCurrencyComboBox.getValue();
        Currency outputCurrency = outputCurrencyComboBox.getValue();
        double inputValue;
        if (!inputAmount.getText().equals("") && isNumeric(inputAmount.getText())) {
            inputValue = DOUBLE_STRING_CONVERTER.fromString(inputAmount.getText());
            double inputValueInDollars = inputValue * inputCurrency.getDollarConversionRate();
            double outputValue = inputValueInDollars / outputCurrency.getDollarConversionRate();
            outputAmount.setText(CURRENCY_FORMAT.format(outputValue));
        }
    }

    @FXML
    private void clearAction(ActionEvent actionEvent) {
        inputAmount.setText("");
        outputAmount.setText("");
    }

    @FXML
    private void switchAutomaticConversion(ActionEvent actionEvent) {
        if (autoCheckBoxButton.isSelected()) {
            convertButton.setDisable(true);
            //  Add ChangeListener to inputAmount to launch convertAction whenever the input value changes
            inputAmount.textProperty().addListener(inputAmountChangeListener);
            convertAction(null);
        } else {
            convertButton.setDisable(false);
            // Remove change listener
            inputAmount.textProperty().removeListener(inputAmountChangeListener);
        }
    }

    private static boolean isNumeric(String str) {
        try {
            double d = Double.parseDouble(str);
        } catch (NumberFormatException nfe) {
            return false;
        }
        return true;
    }

}