2013-07-11 10 views
6

Bir javafx Özelliğinin değerini belirli sınırlar içinde tutmanın en iyi yolu nedir?Bir javafx özelliğinde hangi değerlerin giderilebileceğini sınırla?

(Ya - bu kötü uygulama javafx özellikleri ile sarılmış değerleri filtrelemek asla bir sebep mevcut olduğunu?)

Örnek 1: Bir IntegerProperty
Example2 negatif değerler kaçının: içinde IntegerProperty değerini tutmak

Listesinin sınırları: İlk fikir: - geçersiz kılma IntegerPropertyBase.set(int). Güvenli? Aslında setValue(int) sadece set(int)'u çağırır, ancak - bu uygulama bir gün değişirse - değerler üzerindeki kontrol kaybolur.

İkinci fikir: - IntegerPropertyBase.invalidate() geçersiz kılma. Ama bu noktada değer zaten belirlendi.

Javafx özelliklerine daha uygun olacaksa, IllegalArgumentException (veya sarılmış değer dizinin indisiyse ArrayIndexOutOfBoundsException) veya sınırları en son değere geri döndürerek değeri sonlandırın mı? Belki böyle

:

class BoundedIntegerProperty extends IntegerPropertyBase { 
     (...) 
     int oldValue = defaultValueInBounds; 
     boolean settingOldValue = false; 
     public void invalidated() { 
      if(!settingOldValue){ 
       if(outOfBounds(get())){ 
        settingOldValue = true; 
        set(oldValue); 
       } else { 
        oldValue = get(); 
       } 
      } else 
       settingOldValue = false; 
     } 
    } 

Sadece sınırların dışında özelliğinin değerini tutabilir aut değerleri için geçersiz kılınan bir özel durum() at.

Filtre değerleri için sağlanan javafx özelliklerinde herhangi bir şeyi gözden kaçırdım mı?

hem örneklerde
+1

Özelliği ayarlamadan önce girişi doğrulamak daha basit olabilir. metin alanını, DB sonucunu veya bir dosyadaki verileri doğrulayın. Bunu işlemek için iyi bir yol göremiyorum, gerçekten bir #set() çağrısının bir istisna atmasını ister misiniz? –

+0

Doğru: Bu listeye erişimi olmayan bir liste için bir indeksi ayarlamak mantıklı değil. Ancak listeye erişimim varsa, indeks özelliği için ayarlayıcılar listenin kendisinde olabilir ve özellik yalnızca okunabilir. Listede, dizinin sınırlarının dışında olması durumunda dizinin ayarlayıcısı istisnalar atabilir. –

cevap

2


(Gerekirse, bu metnin ingilizce muhtemelen kötü iyileştirilmesi bana yardım edin ...), (mantıksal varsayılan değer olarak örneğin. Pozitif olması gerekmektedir eğer orada gibiydi negatif sayılar 0'a dönüşür. Bu kadar iyi belgelendiğinizi varsayarsak (değerin geçersiz olması durumunda varsayılan değerler), ilk yaklaşımınızın doğru yolda olduğu gibi olduğunu düşünüyorum.

Sana uzanan ediyoruz sınıf olarak SimpleIntegerProperty (gibi somut bir sınıf ile başlayan öneriyoruz

sen IntegerPropertyBase yerine.

Sonra hem set(int) yöntem ve setValue(Number) yöntemi üzerine yazılacağı, sarma seçti nedense olmadığı sürece . senin mantığında ebeveyn: - aslında istediğimiz

/** 
    * Explanation that values under 0 are set to 0 
    */ 
    @Override 
    public void set(int value){ 
     super.set(value > 0 ? value : 0); 
    } 

    /** 
    * Explanation that values under 0 are set to 0 
    */ 
    @Override 
    public void setValue(Number value){ 
     super.setValue(value.intValue() > 0 ? value : 0); 
    } 

değil mantıksal varsayılan değerler (veya sadece geçersiz değerleri reddetmek istiyorum) olduğu bir durum söz konusu olabilir o dava biraz zor yapar böyle bir yöntem imzası kullanmak için bu yüzden c değeri değişirse aller bilir:

public boolean set(int value) 

bunu için, sen epeyce sınıflarını geri dönmek gerekecek - Kendini yapıyı geçersiz/arka ReadOnlyIntegerProperty tüm yolu ve ayarı uygular.

Geçersiz girdiyi işlemek için İstisnalar kullanmaktan çekinmem gerekir. İstisnaların meşru bir kullanımıdır, fakat benim korkum, istisnanın validasyona dayandığıdır. İstisnalar çok yoğun kaynaklıdır ve sadece düzeltilmesi gereken bir şey varsa vurulmalıdır.Yani gerçekten niyetiniz ve doğru şeyi yapmak için sınıfınızı kullanan insanlara ne kadar güveniyorsunuz (ve size göndermeden önce doğrulayın).

+0

Elbette: eğer giriş yasadışı olabilirse, bir girdinin yasa dışı olup olmadığını kontrol etmek için bir boole işlevine ihtiyacım var. Bu Javafx özelliklerinde yer almamaktadır. –

1

Şu an için neyi daha iyi yaptığınızı anlıyorum. Kullanıcı giriş doğrulaması yapmak istiyorsunuz.

Eğer kullanıcı doğrulama yapıyoruz, bunu ele almanın iki yolu gerçekten var:

  1. doğrula hemen herhangi bir değişiklik meydana gelir ve odak giriş alanını terk ettiğinde geribildirim
  2. doğrula sağladıktan sonra

Her ikisiyle birlikte, mülk dinleyicilerini kullanıyor olacaksınız - bu sadece ilgili mülkün dinleyicisi ile uğraşmanızın bir meselesidir. Eğer doğruladığımızı doğrudan özelliğine dinleyeceğim İlk durumda

:

TextField field = new TextField(); 
    field.textProperty().addListener(new ChangeListener<String>(){ 
     @Override 
     public void changed(ObservableValue<? extends String> value, 
       String oldValue, String newValue) { 
       //Do your validation or revert the value 
     }}); 

ikinci durumda, focused özelliğine dinleyeceğim ve odak kaybolduğunda (sizi doğrulamak) gerekirse değerini geri yardımcı olmak için bu dinleyici son valide değerini koruyabilirsiniz:

TextField field = new TextField(); 
    field.focusedProperty().addListener(new ChangeListener<Boolean>(){ 
     String lastValidatedValue = ""; 
     @Override 
     public void changed(ObservableValue<? extends Boolean> value, 
       Boolean oldValue, Boolean newValue) { 
      if(newValue == false && oldValue == true){ 
       //Do your validation and set `lastValidatedValue` if valid 
      } 
     }}); 

Not: Ben sadece koymak istedim varsayarak bir sistem c güvenli başarısız kullanıcı arayüzünü güncellemek. Yararlı bilgiler verdiğine inandığım için önceki cevabımı bırakacağım.

+0

Doğrulama false değerini döndürürse ve özelliği "oldValue" olarak döndürdüğümde, doğrulama eski değere "yeni" olarak yeniden başlar. 'EskiValue' nin doğrulaması da false değerini döndürürse (doğrulama dinleyicisi eklenmeden önce Mülkte yer alan bir değer), bir döngüye gireriz. Bu durumda, bunlara geri dönmeden önce 'eskiDeğeri 'doğrulamak daha güvenli olacaktır. –