Hallo zusammen und ein frohes neues Jahr,
ich brauche Hilfe beim ChangeListener für Textfelder in JavaFX.
Folgender Sachverhalt:
Für einen Teil eines Programmes möchte ich anhand von einem Listenpreis, dem Mehrwertsteuersatz und einem Rabatt auf den Listenpreis den Verkaufspreis mit und ohne Mehrwertsteuer berechnen lassen.
Weiterhin soll die Möglichkeit gegeben sein, entweder einen Verkaufspreis mit oder ohne Mehrwertsteuer anzugeben, woraus sich dann der Rabatt zum Listenpreis errechnet.
Das Prozedere an sich ist kein Problem, die jeweiligen Berechnungen funktionieren auch ohne Weiteres.
Ich habe für die einzelnen Textfelder per addListener(new ChangeListener...)... (siehe Code unten) das EventHandling implementiert.
Funktioniert im Grunde auch, allerdings wird der Text dann so schnell gesetzt, dass nach Eingabe bereits EINER Ziffer sofort in den Dezimalbetrag umgewandelt wird, da ja das EventHandling für die weiteren Textfelder sofort umgesetzt wird. Ein Anwender kann so unmöglich einen vernünftigen Betrag eingeben.
Umgehen kann ich das mit PauseTransition, was auch funktioniert, aber ein flüssiger Programmablauf sieht anders aus. Das ist irgendwie sehr unschön gelöst.
Gibt es weitere Möglichkeiten, das irgendwie umzusetzen?
Bitte jetzt nicht unbedingt auf die Bezeichnungen achten, das Ganze ist erst einmal nur ein grober Entwurf bzw. Test.
Ich habe die erstbesten Bezeichnungen genommen, die mir in den Sinn kamen.
Vielen Dank im Voraus
ich brauche Hilfe beim ChangeListener für Textfelder in JavaFX.
Folgender Sachverhalt:
Für einen Teil eines Programmes möchte ich anhand von einem Listenpreis, dem Mehrwertsteuersatz und einem Rabatt auf den Listenpreis den Verkaufspreis mit und ohne Mehrwertsteuer berechnen lassen.
Weiterhin soll die Möglichkeit gegeben sein, entweder einen Verkaufspreis mit oder ohne Mehrwertsteuer anzugeben, woraus sich dann der Rabatt zum Listenpreis errechnet.
Das Prozedere an sich ist kein Problem, die jeweiligen Berechnungen funktionieren auch ohne Weiteres.
Ich habe für die einzelnen Textfelder per addListener(new ChangeListener...)... (siehe Code unten) das EventHandling implementiert.
Funktioniert im Grunde auch, allerdings wird der Text dann so schnell gesetzt, dass nach Eingabe bereits EINER Ziffer sofort in den Dezimalbetrag umgewandelt wird, da ja das EventHandling für die weiteren Textfelder sofort umgesetzt wird. Ein Anwender kann so unmöglich einen vernünftigen Betrag eingeben.
Umgehen kann ich das mit PauseTransition, was auch funktioniert, aber ein flüssiger Programmablauf sieht anders aus. Das ist irgendwie sehr unschön gelöst.
Gibt es weitere Möglichkeiten, das irgendwie umzusetzen?
Bitte jetzt nicht unbedingt auf die Bezeichnungen achten, das Ganze ist erst einmal nur ein grober Entwurf bzw. Test.
Ich habe die erstbesten Bezeichnungen genommen, die mir in den Sinn kamen.
Vielen Dank im Voraus
Java:
[/B]
tfKalkRab1.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
Double vkmit, vkohne, rabatt, lp;
if (tfListenpreis.getText().isEmpty() || tfKalkRab1.getText().isEmpty()) {
tfVKoM1.setText("");
return;
} else {
lp = Double.valueOf(tfListenpreis.getText().replace(",", "."));
rabatt = Double.valueOf(tfKalkRab1.getText().replace(",", "."));
vkohne = lp * ((100 - rabatt) / 100);
vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
pause.setOnFinished(
event -> tfVKoM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne))));
pause.playFromStart();
pause1.setOnFinished(
event -> tfVKmM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit))));
pause1.playFromStart();
}
}
});
tfVKoM1.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
Double vkmit, vkohne, rabatt, lp;
if (tfListenpreis.getText().isEmpty() || tfVKoM1.getText().isEmpty()) {
tfKalkRab1.setText("");
return;
} else {
vkohne = Double.valueOf(tfVKoM1.getText().replace(",", "."));
lp = Double.valueOf(tfListenpreis.getText().replace(",", "."));
rabatt = Double.parseDouble(String.format(Locale.ENGLISH, "%1.2f", (vkohne / lp - 1) * (-1) * 100));
vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
pause2.setOnFinished(event -> tfKalkRab1.setText(String.valueOf(rabatt)));
pause2.playFromStart();
pause3.setOnFinished(
event -> tfVKmM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit))));
pause3.playFromStart();
}
}
});
tfVKmM1.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
Double vkmit, vkohne, rabatt, lp;
if (tfListenpreis.getText().isEmpty() || tfVKmM1.getText().isEmpty()) {
tfKalkRab1.setText("");
return;
} else {
vkmit = Double.valueOf(tfVKmM1.getText().replace(",", "."));
lp = Double.valueOf(tfListenpreis.getText().replace(",", "."));
vkohne = vkmit / (Double.valueOf(tfMWST.getText().replace(",", ".")) / 100 + 1);
rabatt = Double.parseDouble(String.format(Locale.ENGLISH, "%1.2f", (vkohne / lp - 1) * (-1) * 100));
pause4.setOnFinished(event -> tfKalkRab1.setText(String.valueOf(rabatt)));
pause4.playFromStart();
pause5.setOnFinished(
event -> tfVKoM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne))));
pause5.playFromStart();
}
}
});
[B]