Temperature Convertor
Typer | Posted on | |
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.text.DecimalFormat;
/**
* Main application class
*/
public class TempConvertor extends Application {
@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new TemperaturePane(), 480, 280);
primaryStage.setTitle("Professional Temperature Convertor");
primaryStage.setScene(scene);
primaryStage.show();
}
static void main(String[] args) {
launch(args);
}
}
/**
* Custom pane class for temperature conversion
*/
class TemperaturePane extends GridPane {
private final Label result, inputLabel, outputLabel, formulaLabel;
private final TextField inputField;
private boolean isFtoC = true;
private final DecimalFormat formatter = new DecimalFormat("#,##0.00");
public TemperaturePane() {
Font font = new Font(18);
Font smallFont = new Font(14);
inputLabel = new Label("Fahrenheit:");
inputLabel.setFont(font);
GridPane.setHalignment(inputLabel, HPos.RIGHT);
outputLabel = new Label("Celsius:");
outputLabel.setFont(font);
GridPane.setHalignment(outputLabel, HPos.RIGHT);
result = new Label("---");
result.setFont(font);
GridPane.setHalignment(result, HPos.CENTER);
formulaLabel = new Label("Formula: [°C] = ([°F] − 32) × 5/9 | [°F] = [°C] × 9/5 + 32");
formulaLabel.setFont(smallFont);
GridPane.setHalignment(formulaLabel, HPos.CENTER);
GridPane.setColumnSpan(formulaLabel, 2);
inputField = new TextField();
inputField.setFont(font);
inputField.setPrefWidth(180);
inputField.setAlignment(Pos.CENTER);
inputField.setOnAction(this::processReturn);
// Vertical toggle button
Button toggleBtn = new Button("⇅");
toggleBtn.setFont(new Font(22));
toggleBtn.setOnAction(this::handleToggle);
setAlignment(Pos.CENTER);
setHgap(15);
setVgap(12);
updateUI("#F5F5F5", "black", "---");
add(inputLabel, 0, 0);
add(inputField, 1, 0);
add(toggleBtn, 1, 1);
GridPane.setHalignment(toggleBtn, HPos.CENTER);
add(outputLabel, 0, 2);
add(result, 1, 2);
add(formulaLabel, 0, 3);
} // End of Constructor
private void handleToggle(ActionEvent event) {
isFtoC = !isFtoC;
inputField.clear();
result.setText("---");
if (isFtoC) {
inputLabel.setText("Fahrenheit:");
outputLabel.setText("Celsius:");
} else {
inputLabel.setText("Celsius:");
outputLabel.setText("Fahrenheit:");
}
}
public void processReturn(ActionEvent event) {
try {
String rawInput = inputField.getText().replace(",", "");
double inputValue = Double.parseDouble(rawInput);
double outputValue;
if (isFtoC) {
double ABSOLUTE_ZERO_F = -459.67;
if (inputValue < ABSOLUTE_ZERO_F) {
updateUI("#000000", "white", "Below Min");
return;
}
outputValue = (inputValue - 32) * 5.0 / 9.0;
} else {
double ABSOLUTE_ZERO_C = -273.15;
if (inputValue < ABSOLUTE_ZERO_C) {
updateUI("#000000", "white", "Below Min");
return;
}
outputValue = (inputValue * 9.0 / 5.0) + 32;
}
inputField.setText(formatter.format(inputValue));
String resultText = formatter.format(outputValue);
double tempInCelsius = isFtoC ? outputValue : inputValue;
applyColorLogic(tempInCelsius, resultText);
} catch (NumberFormatException e) {
updateUI("#FFCCCC", "black", "Invalid Input");
}
}
private void applyColorLogic(double cTemp, String resultText) {
if (cTemp <= 0) {
updateUI("#ADD8E6", "black", resultText);
} else if (cTemp <= 30) {
updateUI("#FFD700", "black", resultText);
} else if (cTemp <= 50) {
updateUI("#FF8C00", "white", resultText);
} else {
updateUI("#FF4500", "white", resultText);
}
}
private void updateUI(String bgColor, String textColor, String text) {
setStyle("-fx-background-color: " + bgColor);
String textStyle = "-fx-text-fill: " + textColor;
inputLabel.setStyle(textStyle);
outputLabel.setStyle(textStyle);
result.setStyle(textStyle);
formulaLabel.setStyle(textStyle);
result.setText(text);
}
}