JavaFX - En handler för alla, eller en för varje?

Trädvy Permalänk
Medlem
Registrerad
Okt 2007

JavaFX - En handler för alla, eller en för varje?

Tjena Sweclockers!
Jag studerar just nu på högskola och vi lär oss nu JavaFX.

Vår lärare rekommenderar att vi gör en Eventhandler för alla knappar/kontrollers istället för en handler för varje knapp. Vad tycker ni om det?
Jag är faktiskt lite skeptisk till det hela, för jag tycker personligen är lättare att hålla reda på allt om vardera kontroll har sin egen Eventlyssnare.

Exempel på en lyssnare för alla mina knappar som jag gjorde utifrån lärarens instruktioner:

private class Lyssnare implements EventHandler { @Override public void handle(Event event) { Button temp = (Button) event.getSource(); Alert a = new Alert(AlertType.INFORMATION); boolean isEmpty = false; switch (temp.getText()) { case "Lägg till": for (TextField tf : textFields) { if (tf.getText().toLowerCase().equals("")) { a.setTitle("One or more fields are empty!"); a.setHeaderText("Warning!"); a.setContentText("One or more fields are empty!"); a.showAndWait(); isEmpty = true; break; } } if (!isEmpty) { try { String regNr, marke, modell; regNr = textFields[0].getText(); modell = textFields[1].getText(); marke = textFields[2].getText(); Car car = new Car(regNr, marke, modell); cars.add(car); changeImage(car.getImage()); //img = car.getImage(); } catch (Exception e) { System.out.println("Error at create new object"); } } System.out.println("Lägg till tryckt"); break; case ">": if(currentCarIndex < cars.size() - 1){ currentCarIndex++; DisplayCar(cars.get(currentCarIndex)); } break; case "<": if(currentCarIndex > 0){ currentCarIndex--; DisplayCar(cars.get(currentCarIndex)); } break; case "Sök": DisplayCar(GetCarViaReg(textFields[0].getText())); currentCarIndex = cars.indexOf(GetCarViaReg(textFields[0].getText())); break; } } }

Här ser ni även att sättet vi får lära oss att urskilja knapparna är att kolla knappens text, vilket jag inte tycker är ett bra sätt alls. Detta då flera knappar kan ha samma text, som t.e.x "Start" "Stopp" eller dylikt. Jag har kollat runt lite och man kan ge varje kontroller ett ID och gå efter det, vilket jag tycker är vettigare.

Men till huvudfrågan då, tycker ni det är vettigt med en handler för alla istället för en för varje? Vad är "best practice"?
Lyckas inte hitta någon litteratur om det hela, bara folk som skriver sina personliga preferenser. Kanske inte finns ett "best practice" för detta?

Förväntansfull på vad ni tycker!

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | MSI GTX 770 2GB SLI

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009

Att använda texten är oerhört dåligt, den kanske ni vill uppdatera ibland och då måste ni ju ändra på flera olika ställen. Att använda samma handler till så många knappar som möjligt är däremot smart, så du kan ha all sammanhörande logik på samma ställe.
Ge knapparna ett id istället:
http://stackoverflow.com/questions/24302636/better-way-for-ge...

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Registrerad
Okt 2007

@DunderKlumpen: Var det jag tänkte. Kommer köra med ID eller att jag gör btn.getSource() == minKnapp

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | MSI GTX 770 2GB SLI

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Tycker definitivt det blir renare kod om man har en event handler för varje kontroll. En kontroll ska ofta bara reagera på ett event och att lägga alla event i en handler gör det otydligt om man har implementerat en handler för en viss kontroll.

I Java 8 är det dessutom superenkelt att implementera anonyma eventhandlers med lambdas.

Java 7-: component.addEventHandler(<eventtyp>, new EventHandler<eventtyp>() { public void handle(<eventtyp>) { … } }) Java 8+: component.addEventHandler(<eventtyp>, (event) -> <gör något>);

Otestad kod men något väldigt likt ska vara möjligt

Bilanaloger är som Volvo — varenda svenne kör med dem