0

Javafx Properties & Bindings Part -1

Önceki bir yazımda kısaca bahsetmiştim şimdi biraz daha detaylı bir şekilde anlatmaya çalışacağım.Property’ler  String ,Integer gibi JavaFx nesneleri için bir Wrapper sınıfıdır , dolayısıyla javafx objelerinin property özellikleri var demektir. Property’ler sayesinde nesnelerimize listener’lar( dinleyiciler) ekleyebilir böylece nesnede olan değişiklikleri gözlemleyebiliriz. İleride konuyu daha da açacağım.  Ayrıca Property’ler ile bir nesne diğer bir nesneye bağlanabilir. Binding kullanılarak property’ler üzerinden nesnelerin değerleri birbiri ile senkronize edilebilir. Yani birinin değeri değiştiğinde tek yada iki taraflı olarak değerleri eşitlenebilir. 

UI Patterns 

Property ve Binding API lerinden bahsetmeden önce kısaca UI Patterns konusundan ( Tasarım Desenleri ) biraz bahsedelim.  GUI ( Graphic User Interface) Uygulamaları geliştirirken kaçınılmaz olan ve karşımıza mutlaka çıkan bazı UI ( User Interface) tasarım mimarileri yada senaryoları  vardır. Bunlar,  MVC ( Model View Controller ) , PM (Presentation Model) , MVP ( Model  View Presenter ) yada MVVM ( Model – view  view-Model) .

Buna bağlı olarak bir çok farklı farklı tasarım fikirleri ortaya çıkmış. Ancak hepsinin gösterdiği ana bir nokta var ki; Model ve View arasında en iyi bağlantıyı , senkronizayonu kurmak.  Yani bunların temel amacı bu. Kullanıcı Arayüz ile etkileşime girdiğinde arkaplanda ki data da tam ve etkin bir şekilde karşılıklı güncellenmeli yani senkron çalışmalı.

Popüler olan UI tasarım desenleri hakkında daha detaylı bilgi için ” GUI Architechture – Arayüz mimarileri ” yazarak google de arama yaparsanız konuya ait bilgi bulabilirsiniz. 

Çünkü bu tasarım desenleri yıllardır  yoğun bir şekilde kafa yorulan bir mesele . Tabi bu tasarım deseni fikirleri java geliştiricileri için bazı eksikleri ortaya çıkarmış ve javafx ekibi bu eksiklerin üstesinden gelmek için bu API ( Property& Binding) yi implemente ettiler eklediler. Bu yazıda Javafx properties & bindings apisi ile data objelerimiz veya arayüz nesneleri arasında nasıl senkronizasyon yapacağımızı öğreneceğiz. 

Java Bean

 JavaBean tasarım yapısında  modelinizi oluştururken field larınızı private olarak tanımlayıp kapsüllüyorsunuz , getter ve setter metodları ile field’larınızı bu metodlar üzerinde yönetiyorsunuz. Örnek; User diye bir class’ımız var ve içinde private olarak tanımlanmış bir değişkenimiz var “password” ve String türünde. Buna bağlı olan iki adet daha metodumuz var ki bunlar: getPassword()  ve setPassword().  Bu örnek JavaBean düzenini mantığını gösteren bir örnek oldu. 

Java Bean mantığı yada tasarım düzeninde bir özelliğe ait değer değişimini yakalamak için  “java.beans.PropertyChangeSupport” API si eklendi . Ancak tamamıyla sorunları çözmeye yeterli olamadı ve developer’lar yıllarca farklı farklı arayışlar ile problemlerini gidermeye çalıştılar ve artık javafx  ile birçok soruna çözüm geldi…

JAVAFX Property Türleri

Şimdi hızlıca JAVAFX Properties Api sine dönelim ve sorunlara nasıl çözümler üretiyor bakalım.  İlk olarak 2 ayrı tipi var bundan bahsedelim.

  1. Read/writable Property
  2. Read -only Property

Kısaca JavaFX property’ler wrapper objeler olmakla birlikte nesnelerin gerçek değerlerini tutmakta ve aynı zamanda nesnelere change ,invalidation ve binding gibi özellikleri katmaktadır. Bu cümle önemli.

Şimdi sık kullanılan Property sınıflarından bahsedelim. Property lere ait Wrapper sınıflarımız Read/Writable – Read /Only türüne göre farklıdır. Ancak tüm property sınıfları ” javafx.beans.property.*” paketinin altındadır. Bakalım burda sık kullanılan  neler var ,

  • javafx.beans.property.SimpleBooleanProperty
  • javafx.beans.property.ReadOnlyBooleanWrapper
  • javafx.beans.property.SimpleIntegerProperty
  • javafx.beans.property.ReadOnlyIntegerWrapper
  • javafx.beans.property.SimpleDoubleProperty
  • javafx.beans.property.SimpleDoubleWrapper
  • javafx.beans.property.SimpleStringProperty
  • javafx.beans.property.SimpleStringWrapper

Propertyler için , Read /Writable olanları  Simple ön eki ve Property son eki ile yazılır. ReadOnly olanlar ise öneki ReadOnly ve son eki Wrapper şeklinde yazılır.  O halde Read/Writable Property lerden başlayalım

Read/Writable Properties

Read/Writable property’ler adından da anlaşılacağı üzere iki taraflı yani hem okunur hem modifye edilebilir. Bir örnek ile yine konuya açıklık getirelim. Read-Writable String türünde bir property oluşturalım  “java.beans.property.SimpleStringProperty” sınıfını kullanacağız. buyrun örnekten…

Burada dikkat çeken nokta “password” değişkenimi “StringProperty” olarak tanımladım ancak örneklemeyi “SimpleStringProperty” sınıfından aldım. Bunun sebebi; Object Orient Programlama dillerinde Abstract ( soyut ) değişken tanımlama daha güzel bir fikir olmasından kaynaklı. Bunun amacı genel tanımladığımız bir objeye daha spesifik bir nesneyi atamak.

Bakın yine burda dikkat çeken bir durum var ki; SimpleStringProperty class’ının constructor’una  parametre geçilen değer bir string.  Yine değeri geri alırken get() metodunu kullandığımıza da dikkat edelim ,  getValue() metodu da aynı işi yapacaktır. set ederken de set() yada setValue() metodları işimizi görecektir. 

Read / Only Properties

Read Only property tanımlarken ReadOnly ön eki ile başlayan wrapper classları kullanıyoruz demiştik. ReadOnly bir property’i 2 adımda oluşturacağız. İlk adımda ReadOnly olan  bir wrapper sınıfdan örnek alarak nesneyi oluşturacağız. ikinci adımda getReadOnlyProperty() metodunu kullanarak gerçek bir property nesnesi döndüreceğiz. hemen örnekleyelim.

Aslında burada aklınıza şu gelmiş olabilir .yukarıda oluşturmuştuk neden bir daha getReadOnlyProperty() metodunu kullandık ki. ? diyebilirsiniz. getReadOnlyProperty() metodu bize nesnenin sadece read-only bir kopyasını döndürüyor.  Javaya göre bu konu şöyle izah edilmiş;  ReadOnlyStringWrapper sınıfı 2 tane senkronize property oluşturuyor. Bunlardan bir tanesi read-only sadece kullanıcılara bakıyor. Diğer property ise readable/writable sistem içinde kullanılıyor.  

Şimdi burada bırakalım çünkü çok uzun oldu. diğer bölümde devam edelim.

 

 

admin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir