संक्षिप्त उत्तर: नहीं, यह नहीं है (जावाएफएक्स 2.x और 8.0 के रूप में)। यह एक भविष्य संस्करण में हो सकता है (JFX> 8)
लांग जवाब: FXMLLoader वर्तमान में एक टेम्पलेट प्रदाता है कि एक ही आइटम बार बार को दर्शाता है के रूप में प्रदर्शन करने के लिए नहीं बनाया गया है। इसके बजाय यह बड़े जीयूआई (या उन्हें क्रमबद्ध करने के लिए) के लिए एक बार लोडर होने का मतलब है।
प्रदर्शन खराब है क्योंकि FXML फ़ाइल के आधार पर, प्रत्येक कॉल पर load()
पर, FXMLLoader को प्रतिबिंब के माध्यम से कक्षाओं और इसकी गुणों को देखना होगा। इसका अर्थ है:
- प्रत्येक आयात विवरण के लिए, कक्षा को सफलतापूर्वक लोड होने तक प्रत्येक कक्षा को लोड करने का प्रयास करें।
- प्रत्येक वर्ग के लिए, एक बीन एडाप्टर बनाएं जो इस वर्ग के सभी गुणों को देखता है और संपत्ति को दिए गए मानकों को लागू करने का प्रयास करता है।
- गुणों के पैरामीटर का उपयोग फिर से प्रतिबिंब के माध्यम से किया जाता है।
वर्तमान में कोड में किए गए उसी FXML फ़ाइल में load()
पर अगली कॉल के लिए कोई सुधार नहीं है। इसका मतलब है: पाए गए वर्गों की कोई कैशिंग नहीं, बीनएडाप्टर की कैशिंग नहीं है और इसी तरह।
वहाँ FXMLLoader उदाहरण के लिए एक कस्टम classloader की स्थापना करके, चरण 1 के प्रदर्शन के लिए एक समाधान है, हालांकि:
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class MyClassLoader extends ClassLoader{
private final Map<String, Class> classes = new HashMap<String, Class>();
private final ClassLoader parent;
public MyClassLoader(ClassLoader parent) {
this.parent = parent;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> c = findClass(name);
if (c == null) {
throw new ClassNotFoundException(name);
}
return c;
}
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
// System.out.print("try to load " + className);
if (classes.containsKey(className)) {
Class<?> result = classes.get(className);
return result;
} else {
try {
Class<?> result = parent.loadClass(className);
// System.out.println(" -> success!");
classes.put(className, result);
return result;
} catch (ClassNotFoundException ignore) {
// System.out.println();
classes.put(className, null);
return null;
}
}
}
// ========= delegating methods =============
@Override
public URL getResource(String name) {
return parent.getResource(name);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
return parent.getResources(name);
}
@Override
public String toString() {
return parent.toString();
}
@Override
public void setDefaultAssertionStatus(boolean enabled) {
parent.setDefaultAssertionStatus(enabled);
}
@Override
public void setPackageAssertionStatus(String packageName, boolean enabled) {
parent.setPackageAssertionStatus(packageName, enabled);
}
@Override
public void setClassAssertionStatus(String className, boolean enabled) {
parent.setClassAssertionStatus(className, enabled);
}
@Override
public void clearAssertionStatus() {
parent.clearAssertionStatus();
}
}
उपयोग:
public static ClassLoader cachingClassLoader = new MyClassLoader(FXMLLoader.getDefaultClassLoader());
FXMLLoader loader = new FXMLLoader(resource);
loader.setClassLoader(cachingClassLoader);
यह महत्वपूर्ण प्रदर्शन को गति। हालांकि, चरण 2 के लिए कोई कामकाज नहीं है, इसलिए यह अभी भी एक समस्या हो सकती है।
हालांकि, इसके लिए आधिकारिक जावाएफएक्स जिरा में पहले ही फीचर अनुरोध हैं। इन अनुरोधों का समर्थन करना आपके लिए अच्छा होगा।
लिंक:
http://javafx-jira.kenai.com/browse/RT-23413
http://javafx-jira.kenai.com/browse/RT-23511
शानदार उत्तर सेबेस्टियन – jewelsea
अंत में लिंक अब मान्य नहीं हैं। क्या किसी को पता है कि वे क्या इंगित करते थे, और अद्यतन जेडीके - ??? उनके अनुरूप आईडी? – Itai