3

Javafx Properties & Bindings Part-3

Basit bir ifade ile , en az iki tane property’inin değerlerinin birbiri ile senkronize olmasını sağlamaktır. Bunun anlamı şu ki; birbirine bağımlı yapılmış iki değerden birinin değeri değiştiğinde diğerinin değeri de değişir. Tabi javafx de bu olay çok kısıtlı birşey değil bunun çok kullanım alanları var. Property ler arasında olabileceği gibi sınıf nesnelerinde  ve GUI kontroller arasında binding yapılabilir. Bu bölümde binding property nesneleri ile binding stratejelerinden bashedeceğiz. 

  • javafx.beans.binding.*
  • javafx.beans.property.*

Binding olayının kullanımı çok basit aslında. İki nesne arasında binding yapılırken kullanılan  property read/writable olması gerek. Bir property’den başka bir property’e bağ kurarken bind() metodunu kullanmak gerek.  bind() metodu ile kurulan bağ tek yönlü bir bağdır. Örneğin: A.bind(B) şeklinde bir kullanımda . A nın değeri değiştiğinde B bunu takip eder ve ona göre değerini otomatik update eder. Ancak burada B değiştiğinde A güncellenmez çünkü tek yönlü ( unidirectional ) bir bind olayı yapmış olduk. 

Evet 3 tane daha binding Stratejimiz var ;

  • Java Bean ile Bidirectional binding 
  • Fluent API ile High-level binding 
  • Low-level binding  javafx.beans.binding.* binding nesneleri ile

Bidirectional Binding

Bidirectional Binding olayı iki taraflı property’ler üzerinden bağlantı kurmayı ifade ediyor. Böyle bir binding yaparken bindBidirectional() metodu kullanılır.  Konuya bir örnek verelim. 

Öncelikle Contact diye bir class oluşturacağım firstName, lastName diye iki tane StringProperty’si olacak. Main metodu içinde de local bir property oluşturacağım ve bunları bidirectional ( çift yönlü olarak ) bağlayacağım. 

Evet herşey ortada değil mi . 

High-Level Binding

Javafx 2.0 ile birlikte gelen ve property’leri birbiri ile bağlamak için kullanılan bir interface var , Fluent API.  Fluent Api nesneye ait metodları bir zincir halinde anlamlı bir şekilde anlatma mantığına dayanıyor.Fluent API kullanımında kullandığınız property ‘ e ait metodları kullanarak bind olayını yaparsınız. Örneğin: Numerik bir property’niz var  bu numerik property ‘nin multiply(), divide(), subtract() gibi metodları var ve hakeza… diğerleri de böyle.  Bu konu ile ilgili bir yazı yazacağım inşallah detayları orada bulacaksınız. Şimdi örnekler üzerinde konuyu anlamaya çalışalım. 

Bakın burada bind metodu kullanmadık. NumberBinding nesnesi tanımladık sebebi hesaplanan değeri tutsun diye ve nesnelerin kendi metodları ile birbirine senkronize bir bağlantı kurduk. örnek gayet güzel açıklıyor. StringProperty olsa idi concat(), replace() … gibi metodlar üzerinden bağlantıyı kuracaktık. 

Low – Level Binding

Low Level binding kullanmak istediğinizde , Binding sınıflarınıdan türetilmiş nesneler oluşturmalasınız ve bunların computeValue() diye bir metodu var  bunları override etmelisiniz. High level de multiply  ,subtract metodları hazır sunulurken burada içeriği sizin hazırlamanız gerekiyor. Multiply yerine ( * ) işaretini kullanarak yapmak gibi.

Low – Level binding kullanarak bir kürenin alanını hesaplayan bir uygulamayı yapalım.

Evet böylece Property ve Binding konusunun sonuna geldik. Şimdi Son bölüm olarak bütün konuyu içeren bir örnek uygulama yapacağız inşallah.

 

admin

3 Comments

  1. Javafx Properties & Bindings Part-3 bölümünde

    “Kürenin alanı” yerine “Kürenin hacmi” olmalı.

  2. Hocam Merhaba
    {
    super.bind(radius); // Bağlantıyı buradaki ifade ile kurmuş oluyoruz.
    // bunu yapmazsanız bağlantı olamayacaktır
    }
    Kod bloğunuz ne yere göre yazdık ben pek anlayamadım.
    DoubleBinding kureninAlani = new DoubleBinding() kod bloğunu başlattığımızda sadece override metodu gelmekte. super.bind Nasıl kullanacağımı pek kavrayamadan biraz açıklayabilirmişsiniz?

    • DoubleBinding nesnesine radius degerinir bind edilebilmesi için constructor’una radius’un parametre olarak gönderilmesi lazım. Yoksa radius değeri set edildiğinde bind işlemi yapılamayacak.

Bir cevap yazın

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