Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
The method setControllerFactory(Callback<Class<?>,Object>) in the type FXMLLoader is not applicable for the arguments (Callback<Class<T>,Object>)
Die Definition ist ja:
Code:
setControllerFactory
public void setControllerFactory(Callback<Class<?>,Object> controllerFactory)
Sets the controller factory used by this serializer.
Parameters:
controllerFactory -
Oh man, ich mache Feierabend ... jetzt habe ich mal selber ein bisschen hinbekommen und dann so ein Tippfehler ... ich meinet getValue ... könnte mich echt ärgern
Damit habe ich den Controller
Jetzt mache ich erst einmal eine Pause .. der Hund hat keine Pampers um .. und dann melde ich mich nachher noch einmal ob es mit dem setStage funktioniert hat.
was soll ich sagen ... ich bekomme es nicht hin
Ich habe es so versucht wie in meiner App wo es mit der übergabe der Stage in den Controller mit Hilfe eines Setter funktioniert, in meiner Test App geht es so nicht und ich finde den Fehler nicht.
Hier mal mein Versuch:
1. In der Main App den Controller holen und mit Hilfe der Setter Methode die Stage primaryStage setzen.
Hallo,
hier noch ein paar weitere Diagnose Steps ...
Wenn ich in der Main.java den FXMLLoader auf die "alte" Weise durchführe, sprich ohne den ViewLoader, und auch den Controller ohne das Pair hole, dann funktioniert es !???
Hier mal die Main.java mit der es funktioniert:
Der Unterschied, bzw. mein Problem/Fehler, muss also irgendwo in der ControllerFactory oder ViewLoader liegen, obwohl das Controller1 Objekt was ich mir hole erst einmal OK ist ...
Also ich müsste jetzt mutmaßen... Und ohne dein Projekt in seinem jetzigen Zustand auszuprobieren, fällt es mir schwer, da eine Aussage zu treffen.
Die ControllerFactory lädt ja nur die Klasse und pusht das Modell rein - die Stage sehe ich noch nicht.
Ich sehe aber auch den Mehrgewinn nicht, wenn man die Stage an einen Controller durchreicht, nur um dort ein #setOnCloseRequest ranzuhängen - so was mache ich eigentlich immer in der #start-Methode der Applikation.
es ging in einem anderen Thread hier im Forum um das austauchen von Exceptions und da haben wir zusammen den Excpetion Listener implementiert, den ich in dieser Test Applikation hier aber nicht drin habe. Im Zuge dessen wurde mir geraten den Exception Listener wieder zu entfernen wenn das fentsre geschlossen wird.
Darum habe ich das dann mit der Übergabe der Stage gemacht, was in dem Stadium ja auch funktioniert, nur halt nicht mehr mit detr Lösung mit den 2 Controllern von gestern.
Ich sehe aber auch den Mehrgewinn nicht, wenn man die Stage an einen Controller durchreicht, nur um dort ein #setOnCloseRequest ranzuhängen - so was mache ich eigentlich immer in der #start-Methode der Applikation.
primaryStage.setOnCloseRequest(event -> {
System.out.println("Close primaryStage now ...");
});
Das funktioniert auch wenn ich das Fenster schließe.
Nun hätte ich aber die Problematik wenn ich einen eigenen Exit Button machen möchte, oder aber z.B. das File - Close Menu.
Dann benötigt der Controller doch auch Zugriff auf die Stage um den Event abzufeuern - oder?
In jedem Control, also jedem Stück UI, das du auf den Scene-Graph bringst, hast du eine Referenz auf die Scene, in der das Stück UI dargestellt wird. Dieses wiederum hat Zugriff auf sein Window. Window ist die Basis-Klasse von Stage. Du kannst also im Regelfall einfach das Window nach Stage casten, et voilà.
das ist ja mal eine Zeile ...
Damit hat es funktioniert und ich würde mir dann auch den Code für setStage und Pair zum holen des Controllers in Main sparen. Das macht es wieder etwas schlanker ... schreibe alle Klassen der hier vorgestellten Lösung 1 noch einmal um und wenn es funktioniert poste ich es - für die Nachwelt
package application;
public interface Controller1Injectable {
void setController1(Controller1 controller);
}
6. ModelInjectable.java
Java:
package application;
public interface ModelInjectable {
void setModel(Model model);
}
7. ControllerFactory.java
Java:
package application;
public class ControllerFactory {
public static <T> T controllerForClass(Class<T> clazz, Model model, Controller1 controller1) {
try {
// controllerInstance#someArbitraryMethodCall if necessary
// will be triggered *before* the initialize method!
T controllerInstance = clazz.newInstance();
// Set Model using Setter in Controller1
if (ModelInjectable.class.isAssignableFrom(clazz)) {
ModelInjectable c = (ModelInjectable) controllerInstance;
c.setModel(model);
}
if (Controller1Injectable.class.isAssignableFrom(clazz)) {
Controller1Injectable c = (Controller1Injectable) controllerInstance;
c.setController1(controller1);
}
return controllerInstance;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
public static <T> T controllerForClass(Class<T> clazz, Model model) {
return controllerForClass(clazz, model, null);
}
}
8. Model.java
Java:
package application;
public class Model {
public String returnString() {
String returnString = "String from Model. Number is: " + randomNumberRange(1, 100);
return returnString;
}
public static int randomNumberRange(int min, int max) {
int n = (max + 1 - min) + min;
return (int) (Math.random() * n);
}
}