Ekran, klavye veya fare'siz ortamlarda grafik arayüz kodları içeren bir Java uygulaması çalıştırırsanız HeadlessException alabilirsiniz. Linux/UNIX bir sunucuya telnet/ssh ile bağlandığınızda, uygulamanız sistem servisi olarak çalıştığında ve benzeri durumlarda bu hata ortaya çıkar.
Java'nin 1.4 versiyonundan itibaren bu durum için Headless mode desteği vardır. Uygulamanızı Headless mode'da çalıştırdığınızda sistem, Toolkit olarak HeadlessToolkit kullanır ve uygulamanızın ihtiyaç duyduğu bazı kaynakları ve parametreleri sağlar.
Uygulamanızın Headless mode'da başlaması için uygulamanızı -Djava.awt.headless=true parametresi ile çalıştırmalısınız. Panel, Canvas gibi bileşenler ve Swing bileşenleri Headless mode'da kullanabilirsiniz, ama JFrame, JDialog gibi en üst seviye container'ları kullanamazsınız.
Headless mode ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan erişebilirsiniz.
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/
HeadlessToolkit'in sağladıkları sizin için yeterli olmayabilir. Örneğin Toolkit'in getScreenResolution, createCustomCursor metodlarına ihtiyacınız var. Bu gibi durumlarda aşağıdaki gibi bir Toolkit tanımlamalısınız.
public class CustomToolkit extends HeadlessToolkit {
public CustomToolkit() {
super(createSystemToolkit());
}
private static Toolkit createSystemToolkit() {
String osName = System.getProperty("os.name");
String toolkitClass = osName.startsWith("Windows") ? "sun.awt.windows.WToolkit" : "sun.awt.X11.XToolkit";
try {
Class<?> clazz = Class.forName(toolkitClass);
Object toolkitInstance = clazz.newInstance();
return (Toolkit)toolkitInstance;
}
catch (Exception exc) {
throw new RuntimeException(exc);
}
}
@Override
public int getScreenResolution() throws HeadlessException {
return 72;
}
@Override
public Insets getScreenInsets(GraphicsConfiguration graphicsConfiguration) throws HeadlessException {
return new Insets(0, 0, 30, 0);
}
@Override
public Cursor createCustomCursor(Image image, Point point, String s)
throws IndexOutOfBoundsException, HeadlessException {
return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
}
}
createSystemToolkit metodunda işletim sistemine göre Toolkit döndürüyoruz. Reflection kullanmamızın sebebi Windows'taki JRE'lerde XToolkit'in, Linux'teki JRE'lerde WToolkit'in bulunmaması.
Bunun gibi problem yaşadığınız Toolkit metodlarını ezebilirsiniz.
Toolkit'imizin etkin olabilmesi için uygulamanızı aşağıdaki parametrelerle çalıştırmalısınız.
-Djava.awt.headless=false
-Dawt.toolkit=CustomToolkit