2013-06-04 20 views
5

Jestem projektowania aplikacji, która ma dwa widgety:Wyświetlanie zmiennych instancji różnych obiektów w JTable i modyfikując je

-A listę zawierającą dowolnych obiektów
-A stół, który wyświetla specyficzne właściwości aktualnie zaznaczonego obiektu

Celem jest możliwość wybrania obiektu z listy, przejrzenia właściwości i zmodyfikowania ich w razie potrzeby. Lista może zawierać obiekty różnych typów.

więc powiedzieć, że lista zawiera Vehicle obiektów i Person obiektów

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

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

Jeśli kliknę na Person obiektu, tabela wyświetli imię i wiek, i mogę przypisać nowe wartości do nich. Podobnie, jeśli kliknę obiekt Vehicle, wyświetli on markę i model w tabeli i pozwoli mi je zmodyfikować.

I zostały uznane za pisanie metody jak

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

która zwraca listę ciągów, które reprezentują zmienne instancji chcę patrzeć, i korzystać z niektórych metod refleksji do get/set im. Mogę zdefiniować tę metodę getFields we wszystkich klasach, dzięki czemu mogę używać tej tabeli do obsługi dowolnych obiektów, które mogą być wrzucone na listę.

Ale czy istnieje sposób zaprojektowania tego, aby nie uciekać się do refleksji? Obecne podejście wydaje się złym projektem.

Z drugiej strony mógłbym utworzyć wiele obiektów TableModel, po jednym dla każdej możliwej klasy. Tabela będzie wiedzieć, jakie wiersze wyświetlić i jak uzyskać dostęp do zmiennych instancji obiektu. Ale za każdym razem, gdy dodawana jest nowa klasa, musiałbym zdefiniować nowy model tabeli, który również brzmi jak słaby projekt.

Odpowiedz

2

Masz klasę (Pojazd) i znasz nazwy niektórych właściwości (marka, model), które chcesz dynamicznie modyfikować dla instancji tej klasy za pomocą interfejsu JTable.

Masz różne podejścia do wyboru.

A. Użyj refleksji API

To właśnie odbicie API jest dla. Jeśli chcesz czegoś tak dynamicznego, nie ma nic złego w korzystaniu z odbicia. Wydajność związana z wydajnością nie będzie znacząca dla tego przypadku użycia.

B. Wykorzystanie biblioteki jak beanutils, który jest oparty na refleksji API

To powinno być łatwiejsze niż bezpośrednio za pomocą refleksji API, ale ma tę wadę, że trzeba zawrzeć kolejną zależność w projekcie .

C. Twórz dynamicznie w środowisku wykonawczym różne klasy TableModel.

Możesz to zrobić, używając java compiler API lub javassist. Na podstawie informacji dostępnych w środowisku wykonawczym można skompilować nową klasę dla każdego innego modelu tabeli.Jeśli zastosujesz to podejście, musisz zdawać sobie sprawę, że tworzenie klasy jest zadaniem ciężkim, więc przy pierwszym utworzeniu TableModel aplikacja zajmie trochę czasu, aby odpowiedzieć.

Co wybrać?

Oczywiście, to jest twoja decyzja. W konkretnym przypadku użycia, narzut dodany przez odbicie lub beanutils jest nieznaczny, więc prawdopodobnie lepiej jest wybrać między A lub B. W innym przypadku użycia, gdzie wydajność jest bardziej krytyczna, możesz zbadać podejście C, nie zapominając o klasie problem z czasem odpowiedzi na tworzenie.

EDYCJA: Właśnie zdałem sobie sprawę, że w tym konkretnym przypadku użycia jest inna ważna funkcjonalność wymagana. Konwertuj z ciągu znaków na odpowiedni typ danych dla każdej właściwości i wice cersa. Beanutils ma na to doskonałe wsparcie, więc dostaje tutaj plus.

+0

1+ i dziękuję za pomocną odpowiedź. –