ActionEvent Press Enter per Code auslösen

SteffiBee

Mitglied
Hallo,

eine Frage, gibt es die Möglichkeit,
dass wenn ich ein TextField auf setOnAction setze, ich in
der handle() Methode das KeyEvent auslöse, dass für ein anderes TextField
per setOnAction gesetzt wurde?

Danke im Voraus.
 
Da wäre die erste Frage: Was spricht dagegen, den ActionHandler direkt aufzurufen? Bzw. die Funktionalität, die benötigt wird in eine Methode zu packen um dies dann in den Event Handlern aufzurufen?
 
Alles befindet sich in zwei unterschiedlichen Klassen.
Java:
public void addPreisActions(TextField listenpreis, TextField ekPreis, TextField tfRabatt) {
        
        listenpreis.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {

                Double ek, rabatt, lp;

                if (ekPreis.getText().isEmpty() || listenpreis.getText().isEmpty()) {
                    tfRabatt.setText(null);
                    return;
                } else {
                    lp = Double.valueOf(listenpreis.getText().replace(",", "."));
                    ek = Double.valueOf(ekPreis.getText().replace(",", "."));
                    rabatt = Double.parseDouble(String.format(Locale.ENGLISH, "%1.2f", (ek / lp - 1) * (-1) * 100));
                    tfRabatt.setText(String.valueOf(rabatt));
                    
                    berechneKalkulatoren(); //---> diese Methode befindet sich in einer anderen Klasse
                }
            }
        });

Java:
public void berechneKalkulatoren() {

        ArrayList<Kalkulator> kalkulatoren = db.getKalkulatoren(tfArtikelnummer.getText());
        Double vkohne, vkmit, lp = Double.valueOf(tfListenpreis.getText().replace(",", ".")), rabatt;

        if (!kalkulatoren.isEmpty()) {

            if (kalkulatoren.get(0) != null) {
                rabatt = kalkulatoren.get(0).getRabatt();
                vkohne = lp * ((100 - rabatt) / 100);
                vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
                tfVKoM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne)));
                tfVKmM1.setText(String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit)));
            }

            if (kalkulatoren.get(1) != null) {
                rabatt = kalkulatoren.get(1).getRabatt();
                vkohne = lp * ((100 - rabatt) / 100);
                vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
                String vko = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne));
                String vkm = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit));
                tfVKoM2.setText(String.valueOf(vko));
                tfVKmM2.setText(String.valueOf(vkm));
            }

            if (kalkulatoren.get(2) != null) {
                rabatt = kalkulatoren.get(2).getRabatt();
                vkohne = lp * ((100 - rabatt) / 100);
                vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
                String vko = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne));
                String vkm = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit));
                tfVKoM3.setText(String.valueOf(vko));
                tfVKmM3.setText(String.valueOf(vkm));
            }

            if (kalkulatoren.get(3) != null) {
                rabatt = kalkulatoren.get(3).getRabatt();
                vkohne = lp * ((100 - rabatt) / 100);
                vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
                String vko = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne));
                String vkm = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit));
                tfVKoM4.setText(String.valueOf(vko));
                tfVKmM4.setText(String.valueOf(vkm));
            }

            if (kalkulatoren.get(4) != null) {
                rabatt = kalkulatoren.get(4).getRabatt();
                vkohne = lp * ((100 - rabatt) / 100);
                vkmit = vkohne + (vkohne * Double.valueOf(tfMWST.getText().replace(",", ".")) / 100);
                String vko = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkohne));
                String vkm = String.valueOf(String.format(Locale.ENGLISH, "%1.2f", vkmit));
                tfVKoM5.setText(String.valueOf(vko));
                tfVKmM5.setText(String.valueOf(vkm));
            }
        }
    }
In dieser Methode sind weitere TextFelder, die müsste ich alle übergeben, wenn ich die Methode in die andere
Klasse packen würde.

Ich habe bereits TextFelder in der anderen Klasse, die diese Berechnungen ebenfalls ausführen, bzw per EventHandler anstoßen.
Wenn ich also das Event per Code ausführen könnte, könnte ich mir die Methode ganz sparen.
 
warum übergibst du nicht einfach die Werte bzw die Propertys die zum berechnen gebraucht werden?

das berechne Kaklulatoren muss immer funktionieren mit den Parametern die Übergeben werden da es ein Model ist ( gut Klassen Attribute gibts auch noch aber die Methode muss auch mit denene IMMER funktionieren )

lp = Double.valueOf(tfListenpreis.getText().replace(",", ".")),
das model sollte eig gar keine nodes überhaupt kennen bzw sehen, und ich nehme an dass da ein Textfeld übergeben wird
 
ich würde es mit einer Hashmap lösen die die Ergebnisse abspeichert und die Keys sind in einem enum ( damit man es lesbarer macht ) weil ich nicht raus lesen kann was die ifs überhaupt berechnen? deswegen auch die fragezeichen.. dann kannst du den ganzen code in den ifs raus ziehen das hab ich in einem anderen thread mal erklärt warum das geht ohne dass ich weis was du überhaupt machst falls es dich interessiert kann ich ihn suchen
Java:
public enum Preis
{
    RABATT,VERKAUF_MIT, VERKAUF_OHNE;
}
Java:
    HashMap<Preis, Double > berechneKalkulatoren( ... parameter ...){
        HashMap<Preis, Double> ergebnisPreise = new HashMap<>();
        ...
        if( db.Kalkulatoren != empty) {
            if ( ... )
            {
                berechneRabatt??();
                ergebnisPreise.put(Preis.RABATT, ergebnis);
            }
            if ( ... ) {
                Double ergebnis;
                berechneAndere??();
                ergebnisPreise.put(Preis.VERKAUF_MIT, ergebnis)
            }
            if ( ... ) {
                Double ergebnis;
                berechneAndere??();
                ergebnisPreise.put(Preis.VERKAUF_OHNE, ergebnis)
            }
        }

wenn du das hast

kannst du ( was ich in einem anderen thread gesagt hab ) die Box wo die ganzen sachen drin sind zb
HBox [
text1
text2
text3
]
dann setzt du die HBox den eventhandler box.onKeyPressed(Key.Enter model.berechneKalkulatoren() somit hast du die problematik gar nicht mehr dass du 3 eventhandler brauchst
 
Also irgend welche Referenzen wirst Du ja haben, denn sonst könntest Du auch kein Event auslösen.
Wenn Du nur das Control hast, dann kannst Du mittels getOnAction den Eventhandler bekommen.

Aber das macht keinen Sinn. Du willst Dich nicht abhängig machen von irgendwelchen Controls. Wenn Du da unterschiedliche Klassen mit unterschiedlichen Controls hast, dann st das eine Abhängigkeit die sehr heftig ist!

Evtl. willst Du einmal anschauen, wie man UIs strukturiert. Dazu gibt es das MVC Pattern oder noch besser: MVVM.
 
Das Problem ist, dass der Sachverhalt schwer zu erklären ist.
Das ist ziemlich komplex.
Jeder einzelne Wert ist von einem anderen abhängig.
Sobald sich ein Wert ändert, egal in welchem Textfeld, müssen alle anderen angepasst werden.
 
Das Problem ist, dass der Sachverhalt schwer zu erklären ist.
ist es immer 😉
Das ist ziemlich komplex.
wenn dein Code nicht idioten sicher ist musst du ihn überarbeiten 😀
Sobald sich ein Wert ändert, egal in welchem Textfeld, müssen alle anderen angepasst werden.
bindings ist da dein anlaufpunkt, nur du sagst immer nur bröckchen was es schwer macht
 
Java:
1. Lieferant Listenpreis Einkaufspreis Rabatt aktualisieren Datum aktualisiert
(ChoiceBox) (TextField) (TextField) (TextField) (Button) (TextField)
also ich stell jetzt mal annahmen
1. wenn du einen Lieferanten auswählst willst du auch die textfelder berechnen?
2. was tut der button?
3. willst du anzeigen lassen dass es was zum kaufen gibt oder willst du einträge erstellen also willst du sowas wie amazon amchen?
 
Also irgend welche Referenzen wirst Du ja haben, denn sonst könntest Du auch kein Event auslösen.
Wenn Du nur das Control hast, dann kannst Du mittels getOnAction den Eventhandler bekommen.

Aber das macht keinen Sinn. Du willst Dich nicht abhängig machen von irgendwelchen Controls. Wenn Du da unterschiedliche Klassen mit unterschiedlichen Controls hast, dann st das eine Abhängigkeit die sehr heftig ist!

Evtl. willst Du einmal anschauen, wie man UIs strukturiert. Dazu gibt es das MVC Pattern oder noch besser: MVVM.
Habe schon versucht so gut es geht, alles zu trennen.
Ein Paket für das Datenbankmanagement. Eins für das Fachkonzept und eins für die GUI.
Als Anfänger merke ich aber meist erst später, dass ich zB. in der GUI zum Teil Dinge drin habe,
die eigentlich ins Fachkonzept gehören.
Bin dabei nach und nach umzustrukturieren, leider stoße ich da zum Teil an meine Grenzen und es funktioniert dann wieder nichts.
 
Habe schon versucht so gut es geht, alles zu trennen.
Ein Paket für das Datenbankmanagement. Eins für das Fachkonzept und eins für die GUI.
Als Anfänger merke ich aber meist erst später, dass ich zB. in der GUI zum Teil Dinge drin habe,
die eigentlich ins Fachkonzept gehören.
Bin dabei nach und nach umzustrukturieren, leider stoße ich da zum Teil an meine Grenzen und es funktioniert dann wieder nichts.
ist das ein studiums projekt oder privates projekt?
 
Java:
1. Lieferant Listenpreis Einkaufspreis Rabatt aktualisieren Datum aktualisiert
(ChoiceBox) (TextField) (TextField) (TextField) (Button) (TextField)
also ich stell jetzt mal annahmen
1. wenn du einen Lieferanten auswählst willst du auch die textfelder berechnen?
2. was tut der button?
3. willst du anzeigen lassen dass es was zum kaufen gibt oder willst du einträge erstellen also willst du sowas wie amazon amchen?
Nein, wenn ich als Händler einen neuen Artikel anlege, gibt es für diesen Artikel unterschiedliche Lieferanten.
Jeder Lieferant hat sowohl unterschiedliche Listen- als auch Einkaufspreise. Aus diesen errechnet sich der Rabatt, den ich bei dem jeweiligen Lieferant bekomme. Die Preise bei den Lieferanten ändern sich monatlich, d. h. ich muss jedes Mal, wenn ich einen Artikel aufrufe überprüfen, ob die Preise diesen Monat schon aktualisiert wurden.
Habe ich die Preise für einen Artikel beim jeweiligen Lieferanten abgefragt und neu eingetragen, klicke ich den Button um das Datum auf das aktuelle Datum zu setzen und die aktualisierten Daten in die Datenbank zu schreiben.
 
ich geb dir mal abstracte standard klassen die dich fast dazu zwingen mvc umzusetzen
kannst sie benutzen oder auch nicht
Java:
public abstract class View<ROOT_PANE_TYPE extends Pane>
{
    protected ROOT_PANE_TYPE root;

    public final ROOT_PANE_TYPE getRootPane()
    {
        return root;
    }

    @Override
    public String toString()
    {
        return "\t\tView =>\n\t\t=> CLASS => " + this.getClass() + "\n\t\t=> ROOT_NODE => " + this.root;
    }
}
Java:
public abstract class Controller<VIEW_CLASS extends View<?>>
{
    protected VIEW_CLASS view;

    public VIEW_CLASS getView()
    {
        return view;
    }

    /**
     * @Override Should be called from other Controllers when The View and it's
     *           components shouldn't be visible
     */
    public final Pane getRootPane()
    {
        return view.getRootPane();
    }

    public String toString()
    {
        return "Controller =>" + "\n\t=> CLASS => " + this.getClass() + "\n\t=> VIEW_OBJECT =>\n" + view.toString()
                + "\n";
    }
}
wenn du sie nicht benutzt ist auch gut hab ich kein Problem damit 😀
 
der controller ruft dann model methoden ab.. aber ob das model in jedem Controller existiiert oder irgendwo public rum liegt ist egal... hauptsache es ist nicht im controller
 
Ich wüsste gerade nicht mal, WIE ich die benutzen sollte, wir haben es komplett anders gelernt.
Schon mit abstracten Klassen, aber eben anders.
Trotzdem danke.
was habt ihr denn gelernt? und wie? bis jetzt ist in deinem Code
1. keinerlei pattern umsetzung ( unerheblich WAS für eins ihr habt ) zb @kneitzel ist für das mvvm pattern mit fxml und ich eher für klassisches mvc... es geht darum IRGENDWAS zu benutzen
2. ich hab in meinem Studium ein Projekt umgesetzt mit 17 mvc "pakete" und es hat jedesmal funktioinert mit den Klassen ... sie schreiben ja nicht wirklich viel vor ... es macht einfach die unterteilung leichter ...
3. da du selber nicht weiter weißt und nicht mehr zurecht kommst werfe ich einfach mal in den Raum dass entweder das vom lehrer oder das von dir nicht funktioniert ... aber da kann ich das zitat von Hans Söllner einbringen "Der Lehrer soll ihnen was beibringen aber die schüler wollen es nicht kapieren"

zb mein "Lehrer" mit doktor titel hat mit uns einen "Objekt orientierten" web browser gemacht... wir hatten dann eine main klasse mit der main.... und eine Browser klasse wo wir 1 Objekt davon erzeugt hatten... also im studium musst du auch mal selber nachdenken ob das so sinnvoll ist , in der normalen schule musst du einfach glauben und nicht widersprechen.. imstudium ist das anders 🙂
 

Zurück
Oben