2013-06-04 13 views
5

modifiyeİki widget olan bir uygulama tasarlama bir JTable çeşitli nesnelerin örnek büyüklüklerinin gösterilmesi ve onlara

hedefi listeden bir nesne almak özelliklerine bakmak ve gerektiğinde bunları değiştirmek mümkün değildir. Liste çeşitli türlerde nesneleri tutabilir.

Yani liste Vehicle nesneleri ve Person nesneleri

public class Person 
{ 
    public String  name; 
    public Integer age; 
} 

public class Vehicle 
{ 
    public String make; 
    public String model; 
} 

Ben Person nesne tıklarsanız, masa adını ve yaşını gösterecektir içeren demek, ve onlara yeni değerler atayabilirsiniz. Benzer şekilde, bir Vehicle nesnesini tıklarsam, tablodaki model ve modeli görüntüler ve bunları değiştirmeme izin verir. Ben bakmak ve almak için bazı yansıma yöntemleri kullanmak istediğiniz örnek değişkeni temsil dizeleri listesini döndürür

public String[] getFields() 
{ 
    return new String[] {"name", "age"}; 
} 

gibi bir yöntem yazma kabul var

/ayarlayın. Tüm sınıflarda bu getFields yöntemini tanımlayabilirim, böylece listeye atılabilen rasgele nesneleri işlemek için tabloyu kullanabilirim.

Ama yansıması çare kalmaması bu tasarlamak için bir yol var? Mevcut yaklaşım kötü tasarım gibi görünüyor.

Öte yandan, birden TableModel nesneleri mümkün olan her sınıf için bir tane yaratabilir. Tablo, hangi satırların görüntüleneceğini ve nesnenin örnek değişkenlerine nasıl erişileceğini bilir. Ama sonra yeni bir sınıf eklendiğinde, zayıf bir tasarıma benzeyen yeni bir masa modeli tanımlamak zorunda kalırım.

cevap

2

Bir sınıf (Araç) varsa ve bir JTable UI aracılığıyla bu sınıfın bir örneği için dinamik manipüle edebilmek istediğim bazı özellikler (markası, modeli) isimlerini biliyoruz.

Seçebileceğiniz çeşitli farklı yaklaşımlarınız vardır.

A. yansıma API

Bu yansıma API'si için yapılmış budur kullanın. Çok dinamik bir şey istiyorsanız, yansıma kullanmanın yanlış bir tarafı yoktur. Bu kullanım durumu için performans yükü önemli olmayacaktır.

B. Kullanım yansıma API dayanmaktadır beanutils gibi bir kütüphane

Bu doğrudan yansıma API kullanarak daha kolay olmalı, ancak bu projenizde başka bağımlılık eklemeniz gerekir dezavantajı .

C zamanında dinamik olarak farklı TableModel sınıfları oluşturur.

Ya java compiler API veya javassist kullanarak yapabilirsiniz. Çalışma zamanında mevcut bilgilere dayanarak, her bir farklı tablo modeli türü için yeni bir sınıf derleyebilirsiniz.Eğer bu yolu takip ederse ilk kez bir TableModel oluşturmak böylece uygulama yanıt vermek biraz zaman alacak, sınıfın oluşturulması ağır görev olduğunun farkında olmalıdır.

Ne seçti ? Tabii

bu sizin kararınız. özel kullanım durumda, havai sınıfını unutmadan, bu yüzden muhtemelen performans daha kritik olan başka bir kullanım durumunda A veya B arasında seçim daha iyidir, o zaman C yaklaşımını önemsiz inceleyebilseydim olan yansıma veya BeanUtils tarafından eklenen oluşturma yanıt süresi problemi.

DÜZENLEME: Sadece bu özel kullanım durumunda gerekli diğer önemli işlevleri olduğunu fark etti. Dizeden, her bir özelliğin ve vice cersa'nın uygun veri türüne dönüştürün. Beanutils bunun için mükemmel bir destek, bu yüzden burada bir artı alır. yararlı yanıt için

+0

1+ ve teşekkürler. –