Harun Reşit Zafer

bâki kalan bu kubbede bir hoş sadâ imiş

Java Swing Pencere Görünümleri (Look and Feel)

laf_logoBu yazıda Java Swing API’si ile masaüstü uygulama geliştirirken farklı pencere görümünlerinin (Look and Feel) nasıl sağlandığını anlatacağım. Ancak bunların öncesinde Look and Feel kavramının anlaşılabilmesi için bir parça felsefe ve bir paragraf kadar edebiyat yapmaktan kendimi alamadım. Sonrasında bu yazıda anlatmış olduğum örnek Adres Defteri uygulamasının farklı look and feel’ler ile görünümlerini ve bunu sağlayan Java kodlarını bulabilirsiniz. Kodların tamamı ise yazının sonunda Netbeans projesi olarak mevcuttur.

Bin bir emekle geliştirilen uygulamaların şık ve kullanışlı arayüzlere sahip olması hayati önem taşıyor. Pencerelerin sadeliği yani yalnızca gerçekten gereli olan bileşenlerin kullanılması, doğru bileşenlerin kullanılması (combo box kullanılacak yerde text box kullanılmaması gibi) ve sezgiselliği, yani programı ilk defa kullanan birinin bile arayüzü sezgileriyle kolayca anlayıp programı kullanabilmesi; çok önemli ve başlı başına uzun bir yazının konusu olan maddeler. Şıklık bunlardan hemen sonra gelse de kullanıcıların gözünde çok önemli bir faktör. Hatta çoğu zaman tercih sebebi. Evet, insanoğlu dış görünüşe aldanır :). Öyleyse biz de içi güzel yazılımlarımıza hak ettikleri dış görünümleri vermeliyiz!  (Gaza geldim, meselenin felsefi kısmına burada nokta koyalım)

Look and Feel kavramını Türkçe’ye çevirmek biraz zor. İlk bakıştaki “gör ve hisset” ya da “bak ve hisset” gibi tercüme girişimleri, kavrama vakıf olunca havada kalıyor. Sanırım bu yüzden “dokun ve hisset” gibi tercümelere rastlıyoruz. Aslında “look” ve “feel” kelimelerinin fiil manaları yerine isim manalarını kullanmak daha uygun bana göre. Look kelimesinin aynı zamanda görünüm ve feel kelimesinin hissediş (yani doku, örneğin bir kumaşa dokunduğumuzda dokusu hakkında bir fikir ileri sürebiliriz) anlamına geldiğini düşündüğümüzde “görünüm ve doku” bana en uygun çeviri olarak geliyor. Bir uygulama penceresine mouse ve klavye ile dokunuruz aslında. Bu dokunuş sırasında pencere elemanlarının verdiği tepki kullanım açısından çok önemlidir.

Örneğin aşağıdaki pencerede aktif metin kutusunun etrafındaki mavi hale ve aktif butonun aldığı mavi renk uygulamanın feel kısmını yani dokusunu oluşturuyor bana göre.

macx4-simple-login

Sanırım bu kadar edebiyat kavramın anlaşılması adına yeterli bir giriş olmuştur. Yazının kalan kısmında look and feel yerine kısaca ve genelde yapıldığı gibi LaF kısaltmasını kullanacağım.

Gelelim Java’daki LaF mevzusuna. Bildiğiniz gibi Java uygulamaları platformlar arası (cross-platform) çalışabiliyor. Örneğin bu yazıda nasılını anlattığım aşağıdaki basit uygulama (aslında sadece arayüzden ibaret) başka platformlarda da sorunsuzca çalışıyor. Burada uygulamanın Windows XP üzerinde çalıştığını ve işletim sisteminin öz LaF’ini kullandığını hatırlatalım.

windows

Aşağıda ise aynı uygulamanın Java’nın varsayılan (default) LaF’i olan Metal ile görünümü var. Uygulama eğer Java’nın kendi LaF’ini kullanıyorsa tüm platformlarda aynı görününecektir. Metal LaF’i için birden fazla tema mevcut. Varsayılan ve bana göre en şık duran Ocean teması ki resimdeki pencere de de bu tema kullanılıyor.

metal

Burada da aynı uygulamanın Linux üzerindeki görünümü var. Burada uygulama Linux’un kendi LaF’ini kullanıyor.

linux

Ve burada da Java 6 ile beraber gelen Nimbus LaF’ini görüyoruz. Bu LaF de Metal gibi Java’nın kendine ait olduğundan her platformda aynı görünecektir.

nimbus

Nimbus gerçekten şık bir LaF. Uygulamaya ayrı bir hava katıyor. Metin kutularının aktifken aşağıda görüldüğü üzere verdikleri  Mac OS X tarzı tepki çok hoşuma gidiyor. Aslında bu yazıya da vesile olan LaF’dir kendisi.

nimbus_focus

Evet artık Swing uygulamalarında LaF’in nasıl ayarlandığını kodlar ile anlatmanın vakti geldi. Java’da aşağıdaki tek satır bunun için yeterli.

Eğer uygulamamızın Metal LaF’i ile çalışmasını istiyorsak:

UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel" );

Metal yukarıda bahsettiğim gibi Java’nın kendi LaF’i olduğundan yukarıdaki kod her platformda çalışır.

Eğer window LaF’ini istiyorsak:

UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );

Ancak bu kod yalnızca Window işletim sistemi üzerinde çalışır.

Bunun yerine programın üzerinde çalışıtığı plaformun LaF’i ile çalışmasını sağlayan aşağıdaki kod daha yerinde olur.

UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

Eğer LaF’i program başladıktan sonra değiştirmek istiyorsak:

UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);//JFrame nesnesini güncelle
frame.pack();//Pencere bileşenlerini yeniden yerleştir.

Son olarak yukarıdaki kodların Java’da try catch bloğu içerisinde olması gerektiğini aşağıdaki Nimbus örneği ile hatırlatalım.

try {
	    // cross-platform Java LaF'i olan Nimbus'u ayarlıyoruz
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    }
    catch (UnsupportedLookAndFeelException e) {
       // Hatayı ele al
    }
    catch (ClassNotFoundException e) {
       // Hatayı ele al
    }
    catch (InstantiationException e) {
       // Hatayı ele al
    }
    catch (IllegalAccessException e) {
       // Hatayı ele al
    }

Adres Defteri uygulamasına bir seçim kutusu (combo box) ekleyerek LaF değişimlerini örnekledim. Fazla uzun olmayan kod anlatılanların güzel bir uygulaması.  Uygulamanın NetBeans proje kodlarını  buradan indirebilirsiniz.

Herkese Kolay Gelsin

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

7 Yorum

  1. UIManager.setLookAndFeel( “javax.swing.plaf.metal.MetalLookAndFeel” );
    hocam bu kodu nereye kopyalamak lazım.mainin içinde hata verdi.

    • admin

      11 Ocak 2011 at 07:43

      Makalenin sonunda tüm kodları indirebileceğiniz bir link var. O kodları inceleyiniz.

  2. Hocam, ellerine sağlık

  3. çok çok teşekkur ederim…

  4. Hocam ellerinize sağlık. Güzel bir dökümantasyon olmuş.

  5. teşekkür ederim hocam

  6. Ellerinize sağlık hocam

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2016 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑