Schlagwort-Archive: Taschenrechner

Einfacher Rechner (FX)

FX_Rechner

Einfacher Grundrechenarten-Taschenrechner mit JavaFX

Die .fxml wurde mit dem SceneBuilder erstellt/bearbeitet, die Hinweisbox wurde mittels AlertDialog umgesetzt. Hier wird nur die FXMLController.java abgebildet, die restlichen Dateien sind mit in dem Archiv.

 

/*FX Rechner
Copyright (C) 2015 Timo Wosnitza

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.*/

package de.wosnitza;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Optional;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Modality;
import javafx.stage.StageStyle;

public class FXMLController {

/*
* Muessen leider alle einzeln angegeben werden, sonst erscheinen sie nicht
* als zuweisbar im SceneBuilder :(
*/
//Nodes - Attribute
@FXML
private TextField eingabeFeldWertEins;
@FXML
private TextField eingabeFeldWertZwei;
@FXML
private Label ergbnisAusgabe;
@FXML
private Button infoButton;
@FXML
private Button beendenButton;
@FXML
private RadioButton radioButtonAddition;
@FXML
private RadioButton radioButtonSubtraktion;
@FXML
private RadioButton radioButtonMultiplikation;
@FXML
private RadioButton radioButtonDivision;

/*
* Die Methoden werden mittels .fxml zugewiesen,
* ebenso die Gruppierung der RadioButton
*/

/*
* die beiden Methoden programmBeendenVorstufeMethode
* und programBeendenMethode arbeiten direkt zusammen.
* Mittels programmBeendenVorstufemethode wird die
* programmBeendenMethode aufgerufen und geprueft ob
* diese wahr ist, wenn sie wahr ist wird das Programm
* geschlossen.
*/

@FXML
private void programmBeendenVorstufeMethode(){
if (programmBeendenMethode()){
// System.out.println("Rueckgabewert angekommen!");
Platform.exit();
}
}
/*
* programmbeendenMethode wird durch die Vorstufenmethode auf-
* gerufen erzeugt einen AlertDialog der als Confirmation deklariert
* ist und in diesem Fall die geforderten zwei Mglichkeiten bietet.
* Ja oder Nein.
*/

//zu Aufgabe 2
private boolean programmBeendenMethode() {
//Rueckgabewert wird erstmal auf unwahr gesetzt
boolean dummy = false;
//Confirmation = wartet auf eine Besttigung,hat min 2 Auswahlmoeglichkeiten
Alert alert = new Alert(AlertType.CONFIRMATION);
//Titel
alert.setTitle("FX Rechner beenden?");
//"Ueberschrift"
alert.setHeaderText("Soll das Programm wirklich beendet werden?");
//Inhalt
alert.setContentText("Waehlen Sie zwischen Ja und Nein!");
//Die beiden zur Verfuegung stehenden Schaltflaechen
ButtonType buttonProgrammBeenden = new ButtonType("Ja");
ButtonType buttonAbbruch = new ButtonType("Nein");
//Schaltflaechen hinzufuegen
alert.getButtonTypes().setAll(buttonProgrammBeenden, buttonAbbruch);
//Anzeigen und warten
Optional result = alert.showAndWait();
//Abfrage wenn ... dann
if (result.get() == buttonProgrammBeenden) {
//wenn ja gewaehlt wurde
dummy = true;
} else if (result.get() == buttonAbbruch) {
//wurde nein gewaehlt dann ...
dummy = false;
//nein = abbruch und der AlertDialog wird wieder geschlossen
alert.close();
}
/*
* Rueckgabewert wird an den Aufrufer zurueckgegeben,
* interessant ist hier nur wenn es wahr ist, dann schliesst
* die Aufrufendemethode das Programm.
*/
return dummy;
}

/*
* In der berechnenMethode werden nicht nur
* die Werte anhand des Operators berechnet,
* es findet auch eine Ausnahmebehandlung statt.
*/
@FXML
private void berechnenMethode(ActionEvent event) {
// lokale Variablen fuer die Berechnung
double wertEins = 0, wertZwei = 0, ergebnis = 0;
//Meldung bei Division durch Null, klingt besser als nicht definiert ;)
final String ERROR = "Infinity!";
//Fehlerschalter, wichtig fuer die Ausgabe
boolean fehlerflag = false;
//Dummy fuer die Ausgabe
String temp;
// Werte vom TextField holen und zum double parsen
try {
wertEins = Double.parseDouble(eingabeFeldWertEins.getText());
} catch (NumberFormatException e) {
//Alert = Besttigungsdialog bei "Fehlern" hier
//fuer Ausnahmen
Alert alert = new Alert(AlertType.ERROR);
//Titel
alert.setTitle("Exception Dialog fuer Feld 1");
//"Ueberschrift"
alert.setHeaderText("Nice Try!");
//Inhalt
alert.setContentText("Except an Exception ;)");
//neue Ausnahme
Exception ex = new NumberFormatException("Exception");

/*
* hier werden mit den "writern" Daten der Ausnahme
* in dem Dialog zur Verfuegung gestellt.
*/
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
//als Text verwendbar machen
String exceptionText = sw.toString();
//Feld fuer die Ausgabe
Label label = new Label("The exception stacktrace was:");
//Textbereich fuer dei Ausnahme
TextArea textArea = new TextArea(exceptionText);
/*
* TextField ist bearbeitbar, dies ist hier nicht erwuenscht
* daher daektiviert und Textumbruch aktiviert.
*/
textArea.setEditable(false);
textArea.setWrapText(true);
//Masse fuer die Ausgabe
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
GridPane.setVgrow(textArea, Priority.ALWAYS);
GridPane.setHgrow(textArea, Priority.ALWAYS);
//erstellen und hinzufuegen
GridPane expContent = new GridPane();
expContent.setMaxWidth(Double.MAX_VALUE);
expContent.add(label, 0, 0);
expContent.add(textArea, 0, 1);
// ist "ausklappbar" erweiterbar (sichtbereich)
alert.getDialogPane().setExpandableContent(expContent);
//anzeigen und warten
alert.showAndWait();
}
/*
* Fuer das zweite Feld gelten die gleichen
* Kommentare wie Feld eins, Kode ist sinngemaess
* an Feld zwei angepasst.
*/
try {
wertZwei = Double.parseDouble(eingabeFeldWertZwei.getText());
} catch (NumberFormatException e) {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Exception Dialog fuer Feld 2");
alert.setHeaderText("Nice Try!");
alert.setContentText("Except an Exception ;)");
Exception ex = new NumberFormatException("Exception");
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
String exceptionText = sw.toString();
Label label = new Label("The exception stacktrace was:");
TextArea textArea = new TextArea(exceptionText);
textArea.setEditable(false);
textArea.setWrapText(true);
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
GridPane.setVgrow(textArea, Priority.ALWAYS);
GridPane.setHgrow(textArea, Priority.ALWAYS);
GridPane expContent = new GridPane();
expContent.setMaxWidth(Double.MAX_VALUE);
expContent.add(label, 0, 0);
expContent.add(textArea, 0, 1);
alert.getDialogPane().setExpandableContent(expContent);
alert.showAndWait();
}
/*
* Auswahl der Berechnung anhand des selektierten
* RadioButton. Bei Division wird Wert zwei erst auf 0
* geprft. Anhand des Fehlerschalters wird das berechnete
* Ergebnis oder Fehlertext ausgegeben.
*/
if (radioButtonAddition.isSelected())
ergebnis = wertEins + wertZwei;
if (radioButtonSubtraktion.isSelected())
ergebnis = wertEins - wertZwei;
if (radioButtonMultiplikation.isSelected())
ergebnis = wertEins * wertZwei;
if (radioButtonDivision.isSelected()) {
//wenn nicht null
if (wertZwei != 0)
ergebnis = wertEins / wertZwei;
else
//bei null
fehlerflag = true;
}
//wenn alles ok dann weiter
if (fehlerflag == false) {
temp = Double.toString(ergebnis);
ergbnisAusgabe.setText(temp);
} else
//Fehlertext anzeigen
ergbnisAusgabe.setText(ERROR);
}

/*
* infoAnzeigenMethode zeigt ein Dialogfenster
* mit dem Hinweis auf den Autor.
* Sie wird aufgerufen wenn der InfoButton
* gedrueckt wird.
*/
public void infoAnzeigenmethode() {
//Inforamtion = Hinweisfenster mit "Ein-Button-Bestaetigung"
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Programminfo");
alert.setHeaderText("FX Rechner v1.3 final");
alert.setContentText("by Timo Wosnitza");
alert.showAndWait();
}

}