JavaFX teknolojisi Sun microsystems firmasının RIA (Rich Internet Applications - Zengin Internet Uyugulamaları -) alanında yaptığı bir teknoloji atılımıdır (yatırımı). Teknoloji terimini kullandım çünkü her ne kadar JavaFX bir script dili gibi gözükse de bundan çok ileri bir şeydir. JavaFX script dilinin yanında bu dil kullanılarak yaratılmış bileşenler ve yine bu bileşenleri desteklemek adına işletim sistemine özgü kütüphaneler içerir. JavaFX mobil cihazlar, sınırlı bağlantı içeren mobil cihazlar ve popüler işletim sistemlerinde desteklenmek üzere geliştirilmektedir. JavaFX'in script dili henüz tam oturmuş değil önceki yazımdaki siteden changelogları takip ederseniz yada en güncel kaynak dosyaları incelerseniz v4 de olduğunu görürsünüz. Ancak SDK Preview den anlaşıldığı kadarıyla kolay ve etkin bir dil olacak. JavaFX Java ile aynı yoldan giderek bağzı teknikleri anahtar kelimelerle dil düzeyinde desteklemiş. JavaFX de animasyon için "tween" anahtar kelimesi kullanılması buna güzel bir örnek. JavaFX'in ilginç bir yanı da java sınıflarını direkt kullanabilmesi. Yani script dostanızda import java.io.*; yada import javax.swing.JFrame; kullanarak o sınıfı bir değişkene atayabilir ve sonra özelliklerine ve metotlarına ulaşabilirsiniz. Bu durumda JavaFX Java teknolojilerinin hepsini barındırıyor. Ancak bu tarz da ( Java sınıflarını import ederek) yazılan bir uygulama pek de JavaFX script kullanarak yazılmış olmuyor. Durumu script lehine çevirmek için ( uygulama yazma kolaylığı adına ) Java sınıflarını sarmalıyor ve JavaFX bileşenlerini oluşturuyor. Peki hedef ne?
- Multimedia desteği vermek
- Hem interaktif hem de şık kullanıcı arayüzleri oluşturmak
- JavaFX'in java plug-in'e adapte edilerek internet tabanlı kullanıma açmak
- Kolay kullanım
- Çok platformluluk
- Network tabanlı uygulama
- Hızlı ve etkin programlama
- Geliştirme ortamı desteği
1. Multimedia desteği JavaFX tarafından desteklenmesindeki en önemli sebep artan internet hızı ve depolama kapasitesi nedeni ile artık uygulamaların video ortamlarını desteklemesi gerekliliği. Bu durum video yayınlama sitelerin artışı ve buna ulaşan programlara olan rağbetle kendini belli ediyor. Javada zaten multimedia desteği yok muydu dersek Java Media Framework (JMF) vardı. Ama popüler codecleri desteklemiyordu. JMF 'de üçüncü parti codec desteği ancak java sınıfları ile yazılmış olmalıydı ( Zahmetli ve güncellik zor sağlanıyor). JMF encoderlerı iyi desteklemiyordu. Çok platformlu değildi. Sadece JavaSE destekli ortamlarda çalışıyordu. Java Media Components (JMC): Platforma bağlı multimedia bileşenlerini (DirectShow, Gstreamer) kullanan doğal kütüphane (jmc.dll, jmc.so gibi) ile java sınıfları arasında iletişim kurularak codec desteğinin büyük bir kısmı platformdan sağlandı (codec desteğinin JavaFX den soyutlanması). Kullanıcının istediği codec'i yüklemesi ve gerekli güncelliği sağlaması kendi elinde oldu ( Lisans Problemleri kullanıcının problemleri haline geldi). Encoding (kodlama) decoding (kodu açma) işlemi çok kolay yapılabilir olacak. Codec' in yerel sistemden sağlanıyor olması durumunda eğer codec destekliyorsa SSE, MMX , çok çekirdekli işlemciden yararlanma , deinterlace v.s. gibi teknolojilerden yararlanmak mümkün . Codecler sisteme kurulu olmasa bile Sun microsystem'in JavaFX'in ileri ki sürümleri için söz verdiği HD ortamları destekleyen hızlı, On2's TrueMotion codeclerinin rahatlıkla kullanımı mümkün olacak 2. JavaFX' de görsel olan herşey bir düğümdür (Node) ve stage denen sahnelerde sunulurlar. Sahne desteği Sun microsystems'in yürüttüğü scenegraph projesiyle destekleniyor. Bu projede herşey birbiri ile ilişkilli birer düğüm zinciri tıpkı html ağacı gibi. Scenegraph görsel efektleride destekliyor. Görsel efektler Decora projesi ile destekli. Decora platforma yönelik donanım hızlandırması için doğal kütüphanelerin yazıldığı proje. Decora efektleri uygularken eğer destekleniyorsa windows ortamalarında hem DirectX9 hemde OpenGL destekli. Linux, Solaris ve MacOSX de ise OpenGL destekli. Bunun yanından sisteme göre SSE veya software (yani işlemci) desteği de var. Efektlerin donanım hızlandırması duruma göre DirectX shader language yada Opengl shader language diline çevrilen ancak henüz ayrıntıları belli olmayan java shader language ( jsl ) dili kullanılarak sağlanıyor. Böylece işlemci zamanı boşa harcanmamış oluyor. Eğer ilgili dosyaları bulamazsa (Decora-D3D.dll, v.s gibi) işlemci devreye giriyor. Hangi sistemin kullanıldığı sorgulanabiliyor. JavaFX de Swing bileşenleri scenegraph tarafından desteklenen çizimler, yine ilerde kavuşacağımız ileri düzey bileşenler (akordiyon menü, görünüşleri değiştirilebilir bileşenler -skinable- v.s) ve JMC tarafından gösterilen media Stage eklenebilir tarzda yazılıyor. Bu durumda stage eklenecek her türlü görsel bileşene ayrı ayrı olmak üzere efekt uygulanabiliniyor. Bu da oldukça şık arayüz tasarımlarının önünü açıyor. Efektler birbiri ardına uygulanabiliniyor. SVG desteği JavaFX SDK Preview de var. 3. JavaFX teknolojisinin son zamanlardaki kaynak kodundaki yapılan değişikliklere baktığımız zaman yansıtma (reflection) uygulandığını ve bunun java plug-in desteği ile alaklı olduğunu ifade eden açıklamalar görüyorum. Böylelikle JavaFX java plug-in le etkileşime girecek. Dolasıyla bu durum tarayıcı ortamı ile iletişim ve applet teknolojisinin canlanması anlamına gelebilir. Ancak bu etkileşimin mimarisi zaman içinde belli olacak. 4. JavaFX javafxc, javafx, javafxdoc adlı çalıştırılabilir dosyalarla geliyor. javafxc bir derleyici. javafx gerekli kütüphane dosyaları ve jar dosyalarının yolunu çalışma yoluna ekleyerek scripti çalıştırıyor. javafxdoc ise isterseniz kaynak dosyalarda kullanılan özel etiketlerle belgeler üretiyor. Ancak javafxdoc bu işi javadocdan çok daha iyi yapıyor. javafxdoc'un ürettiği belgeler html ve xml belgesi olabiliyor. Üretilen belgeler görsel olarak zengin ve interaktif. 5. Yine JavaFX teknolojisinin geliştirme deposunu incelediğimiz zaman Windows, Linux, MacOSX ve Solaris platformlarının desteklenmesi konusunda çalışmalar sürmekte. Fakat JavaFX çok platformluk konusunda javanın girdiği her yere girmeye çalışıyor. Bu bağlamda cep telefonları, cep bilgisayarları, dijital televizyon kutuları (Dijitürk gibi), gelişmiş multimedia ürünleri (Blue-Ray) gibi sınırlı bağlantılı cihazlarla bağlantılı cihazlar dahil pek çok ortamda var olma yolunda ilerleyecek. 6. Tabi ki yine her şey network ve buna JMC dahil. JMC akış (streaming) teknolojisini destekleyecek. RIA için gereken destek verilecek. Hali hazırda JavaFX SDK Preview sürümünde resimlerin direkt networkden indirilmesi mümkün. 7. JavaFX Javanın izinden giderek satırlarca kod yazarak elde ettiğiniz bazı teknikleri anahtar kelimeler ile sağlamış bulunuyor. Örneğin bir bileşenin ekranda artan ve azalan şekilde parlaması için ilk önce ilgili efekti uyguluyorsunuz. Sonra uyguladığınız efektin etki derecesini arttırıp azaltarak animasyonu elde ediyorsunuz. Normal de sadece bu işlem satırlarca kod yazmayı gerektirir. Birde değer tipi çok çeşitli olsun dersen ( Tamsayı -Integer-, Noktalı sayı -Float-) kod satırı sayısı iyce büyür. JavaFX de "tween, bind" anahtar kelimeleri ile "=>" operatörü yeterli desteği sağlıyor. Dizilere alternatif olarak sequence değişkenleri var. Sequence değişkenlerine özel operatörler ve anahtar kelimeler dizi oluşturma eleman ekleme çıkartma işini kolaylaştırıyor. JavaFX script ilk önceleri interpreter olarak tasarlanmıştı. Ancak performans endişeleri python gibi script dillerinde olduğu gibi JavaFX script dosyalarını yorumlayıp derleyerek java sınıfı karşılıklarına çeviriyor. 8.JavaFX geliştirme ortamı olarak Netbeans üzerinde JavaFX plug-in kullanıyor. JavaFX SDK Preview ile beraber çıkmış olan bu plug-in henüz basit bir destekden ibaret. Basit destek dediysek tabi ki debug, profiler paletden sürükle bırak kode klipleri ve parser desteği var. Fakat parser, otamatik tamamlama, otomatik import hanüz iyi çalışmıyor. Büyük ihtimalle bu konuda da kapalı kapılar ardında çalışmalar sürüyor. Ancak Sun microsystems Swing tabanlı uygulama inşahasında kullanılanan matise benzer bir ortam sağlıyacak ve bu ortam flash programına pek benzemeyecek.Çünkü Sun microsystemse göre bu web programcılığı tarzında bir destekden ibaret. Diğer yandan sanatsal destek JavaFX SDK Preview Project Nile adı altında grafik programları ile (Adobe Photoshop ve Illustrator) görsel öğelerin JavaFX de kullanılması için SVG formatında plug-in düzeyinde destek veriyor. Bu destek linux tabanlı ortamlar için varda denemez yok da denemez. Çünkü linux ortamındaki grafik programları SVG yi zaten destekliyor. Project Nile dosyalarının exe olduğuna bakmayın jar dosyalarıda çalışıyor. Bu durum linux ortamında da geçerli. Inkspace ile yarattığınız çizimleri düz SVG dosyası olarak kayıt edin ama türkçe karakter kullanmayın. SVG converter ile çizimlerinizi fx dosyalarına çevirebilirsiniz. Peki tüm bunlarla neler yapılabilir: Henüz dosya sistemine erişim script düzeyinde yok ama yine de scriptin sınıflara erişimi ile desteği kendiniz oluşturabilirsiniz. Bu durumda az sayıda kod yazarak mp3 çalar video oynatıcı yazabilirsiniz. JMC bileşeni bir node sınıfını genişletir. Bu durumda oynatdığınız filme tek satır kod ile efekt (siyah beyaz) ekleyebilirsiniz. Efektleri arka arkaya sıralayarak daha fazla efektle daha ilginç şeyler yapabilirsiniz. Skin özelliği eklenince oynatıcınıza istediğiniz skinleri üretebileceksiniz. Kendi bileşenlerinizi yaratabilirsiniz. Node sistemi nedir ve bizim için önemi ne olabilir: Node (düğüm) sistemi tek bir sahne (stage) üzerine pek çok birleşen eklemek üzerine geliştirilmiştir. Kendi özel düğümlerinizi yaratabilirsiniz. Örneğin bir basit bir araba çizmek için CustomNode sınıfını kullanarak siyah bir daire ve içine daha küçük beyaz bir daire çizerek bir teker oluşturursunuz. Artık her sınıf örneğinizde bir tekerleğiniz var. İki tekeri oluşturup bunu Grup sınıfı ile tek bir node haline getirebilirsiniz. Geometrik öğelerin kesişimlerini alabilir, birbirinden çıkarabilir, ekleyebilirsiniz. Bir görselin (swing, Media viewer, SVG, resim, kare, daire, v.s) node olarak sarmalanması demek tüm nodların sahip olduğu özelliklere sahip olması demektir. Bu özellikler
- Mouse ve klavye olaylarını alabilmek yada almamayı tercih etmek
- Efektlerin uygulanabilmesi
- Öteleme (translate)
- Bükme (shear)
- Çevirme (Rotate) ve belirli bir noktadan çevirme
- Transformasyon (öteleme, bükme ve çevirme işlemlerinin bir arada uygulanması)
- Saydamlık(Opacity)
- Daha hızlı çizim için ön bellekleme (cache)
- Ebeveyn tespiti
- Düğüme kimlik (id) ataması
- Görünülük (Visibility)
- Diğer düğümlerin önüne alma gerisine atma
- Kırma (Clip) ve kırpma yumuşatma
Önbellekleme çizimi geçici bir dizinde resim olarak saklamaya dayanır eğer çizimde değişiklik olursa ön bellek güncellenir. Sık değişmeyen öğelerde performans sağlar. Kimlik (id) özelliği ilgili node (düğüme) hızlı ve emin ulaşım sağlar. İlginç olan photoshop ve illustrator eklentileri katman isimlerini düğüm isimlerine atayarak her katmandaki SVG çiziminin ayrı tutulmasını ve ulaşımını kolaylaştırır. JavaFX'in geliştirildiği depodan indirdiğimiz kaynaklara ve changeloglara (yapılan değişiklikler günlüğü) bakacak olursak bütün her şeyin düğüm uzayına geçirilmek için çalışıldığına dair notlara rastlıyoruz. Eğer bu yapılırsa windows xp de olduğu gibi kapatma durumunda ekranın kararması gibi bizde program penceresinin kararmasını sağlayabiliriz. Artık günümüz kullanıcıları kullandığı programların zaten görsel yönden zengin olması taraftarılar. Bu durumdan dolayıdır ki RIA terimi ortaya çıkmıştır. Aslında JavaFX script olmadan da şu anda efektleri, stageleri, nodeları, grupları, geometrik çizimleri kullanabilirsiniz. Çünkü tüm bunlar açık kaynak kodlu olarak geliştirilen scenegraph ve decora projelerinden sağlanıyor. Örneğin decora kullanarak resim dosyalarınıza JavaFX olamada da efekt uygulayabilirsiniz. Efektler dedik ama hangi efektler kullanıma hazır olarak geliyor.
- Karıştırma (Blend) : İki resmi karıştıma moduna göre (BlendMode) bir birleriyle karıştırır. Photoshop, Gimp gibi fotoğraf editörleri ile benzer şekilde çalışır.
- Bloom : Bu efekt resmin beyaz öğlerinin parlamasını sağlar.
- Renk ayarlama (Color Adjust) : Parlaklık, doygunluk, renk değerlerini ayarlama imkanı sağlar
- Displacement map : Bu efekt aslında oldukça güçlü bir efekt. Yerdeğiştirme efekti ediğimiz bu efekt FloatMap denen bir haritaya ihtiyaç duyuyor. FloatMap adından da anlaşılacağı gibi noktalı rakamlardan (Float) oluşan bir dizi. FloatMap içerisindeki sayılar resim üzerindeki ilgili piksellerin yer değiştirmesini etkiler. FloatMap için bir genişlik ve yükseklik bilgisi verilmesi gerekir. Genellikle harita büyüklüğü resim büyüklüğüyle aynıdır. Bu da bu efekti oldukça güçlü yapar.
- Gölge ekle (Drop Shadow) : Gölge ekle efekti için gölgenin uzaklığını, rengini, gölgenin bulanıklığını ayarlamanıza izin verir.
- Flood (türkçesini bende bilmiyorum) : Bu efekt sadece bir dikdörtgen çizer ve içini istediğiniz bir renk yada gradient ile doldurur.
- Gaussian bulanıklığı (Gaussian Blur) : Gaussian tekniği ile bulanıklaştırma sağlayan bir efekt
- Parlatma (Glow) : Uygulandığı öğede parlak alanlar yaratır. Bloom dan pek farkını göremedim.
- İç Gölge (InnerShadow) : Gölgeyi kenarlardan uzağa değilde kenarlardan içeri doğru yerleştirir.
- Maskeyi Ters Çevir (InvertMask) : Eğer resiminizin bir alfa kanalı varsa bunu tersine çevirir. Bu durumda resmin saydam kısımları opak opak kısımları saydam hale gelecektir.
- Işıklandırma (Lighting) : İşte bir gelişmiş efekt daha. Bu efektle özellikle grafik ve yazılara ışıklandırma ile birlikte 3D efekt etkisi yaratabilirsiniz.
- Hareket bulanıklığı (MotionBlur) : Adı üzerinde hareket eden cisimlerin içerisinden bakarken gördüğümüz bulanıklaşması ile aynı etkiye neden olur.
- Perspektif Değişimleri (PerspectiveTransform) : Evet bir sağlam efekte bu efekt. Bu efekte en iyi örnek vistada programlar arasında geçiş yapmak için kullanılan efektdir. Bu resimlere özel olarak perspektif vermek için dört köşesinin koordinatalarını ayarlamanıza izin verir. Bu durumda sol köşeler normal konumlarındayken sağ köşeler ortaya doğru ve birbirlerine yakın konumlandırılınca resim yan duruyormuş gibi görünür bu da 3D efekti yaratır. Ama siz böyle yapmak zorunda değilsiniz. Eğer isterseniz köşeleri ters çevirerek resmi ters-yüz de edebilirsiniz.
- Yansıma (Reflection) : Bu efekt resmin altında yansıma oluşturur. Yansımanın resmin alt kenarına uzaklığını, alt ve üst kenarının saydamlığını ve saydamlaşmanın başlangıç hattını belirleyebilirsiniz.
- Eski fotoğraf tonu (SepiaTone) : Adı üzerinde resmin eski fotoğraflarda olduğu gibi kahverengimsi bir görünüm kazanmasına neden olur.
Şimdilik bu kadar ama aklıma geldikçe bir şeyler eklemeyi düşünüyorum. Hatta zamanım oldukça kod örnekleride yayınlayacağım.