Ich hatte kürzlich das Problem das ich eine FXML im Scenebuilder bearbeiten wollte und die FX-IDs vergeben wollte.
Das auswählen einer Textbox hat ca. 30 Sekunden gedauert sowie das anschließende auswählen der ID über die Combobox.
Hintergrund war der das der Controller der zu der FXML gehört recht groß ist und dieser bei jedem klick im Scenebuilder neu geparst wird.
Der Hack wird in folgender Klasse gemacht: com.oracle.javafx.scenebuilder.kit.glossary.BuiltinGlossary
Hierzu wird das letzte Ergebnis + das Letzte Editierdatum der Datei gemerkt:
[codesyntax lang=“java“]
//NEU
private long lastUpdatequeryControllerClasses = 0;
//NEU
private List<String> resqueryControllerClasses ;
@Override
public List<String> queryControllerClasses(URL fxmlLocation) {
if (fxmlLocation == null ) {
return Collections.emptyList();
} else {
File fxmlFile = getFileFromURL(fxmlLocation);
if (! fxmlFile.exists()) {
// Suspicious ! May I print some warning ? or assert the file exists ?
return Collections.emptyList();
} else {
//Speedhack
if(resqueryControllerClasses == null || lastUpdatequeryControllerClasses < fxmlFile.lastModified()){
List<String> res = new ArrayList<>();
for (ControllerClass cc : ControllerClass.discoverFXMLControllerClasses(fxmlFile)) {
if (! res.contains(cc.getClassName())) {
res.add(cc.getClassName());
}
}
Collections.sort(res);
//NEU
resqueryControllerClasses=res;
lastUpdatequeryControllerClasses = fxmlFile.lastModified();
return res;
}
return resqueryControllerClasses;
}
}
}
//NEU
private long lastUpdatequeryFxIds = 0;
private List<String> resqueryFxIds ;
@Override
public List<String> queryFxIds(URL fxmlLocation, String controllerClass, Class<?> targetType) {
// TODO fix DTL-5878
assert controllerClass != null;
if (fxmlLocation == null ) {
return Collections.emptyList();
} else {
File fxmlFile = getFileFromURL(fxmlLocation);
if (! fxmlFile.exists()) {
// Suspicious ! May I print some warning ? or assert the file exists ?
return Collections.emptyList();
} else {
//NEU
if(resqueryFxIds == null || lastUpdatequeryFxIds < fxmlFile.lastModified()){
List<String> res = new ArrayList<>();
for (ControllerClass cc : ControllerClass.discoverFXMLControllerClasses(fxmlFile)) {
if (controllerClass.equals(cc.getClassName())) {
res.addAll(cc.getFxIds());
break; // discoverFXMLControllerClasses may return duplicates.
// The first matching class name is good enough for now.
}
}
Collections.sort(res);
resQueryEventHandlers=res;
lastUpdatequeryFxIds = fxmlFile.lastModified();
return res;
}
return resqueryFxIds;
}
}
}
//NEU
private long lastUpdatequeryEventHandlers = 0;
private List<String> resQueryEventHandlers ;
@Override
public List<String> queryEventHandlers(URL fxmlLocation, String controllerClass) {
assert controllerClass != null;
if (fxmlLocation == null ) {
return Collections.emptyList();
} else {
File fxmlFile = getFileFromURL(fxmlLocation);
if (! fxmlFile.exists()) {
// Suspicious ! May I print some warning ? or assert the file exists ?
return Collections.emptyList();
} else {
//NEU
if(resQueryEventHandlers == null || lastUpdatequeryEventHandlers < fxmlFile.lastModified()){
List<String> res = new ArrayList<>();
for (ControllerClass cc : ControllerClass.discoverFXMLControllerClasses(fxmlFile)) {
if (controllerClass.equals(cc.getClassName())) {
res.addAll(cc.getEventHandlers());
break; // discoverFXMLControllerClasses may return duplicates.
// The first matching class name is good enough for now.
}
}
Collections.sort(res);
resQueryEventHandlers = res;
lastUpdatequeryEventHandlers = fxmlFile.lastModified();
return res;
}return resQueryEventHandlers;
}
}
}
[/codesyntax]