Praca na rekordach

0

Witam,
próbuje zrobić zarządzenie rekordów (z GUI). Borykam się z problemem jak prawidłowo rozwiązać to. Mam listowanie rekordów. Na chwilę obecną wykorzystuję JList. Teraz sprawa. Jak skomponować ten JList, żeby np. zaznaczenie danego rekordu na liście i kliknięcie na button Edytuj otworzyło mi np. nowe okienko z foormularzem dla tego rekordu.

Wiem, że mogę wykorzystać getSelectedIndex(), ale jak skomponować listę żeby aplikacja wiedziała który rekord potem edytować ?

0

w konstruktorze lub metodzie wyświetlającej nowe okno (okno edycji) możesz przekazać obiekt związany z wybranym rekordem.

A tak btw dla mnie jako użytkownika Twojej aplikacji wygodniejsze byłoby, gdybym nie musiał klikać na jakiś przycisk aby edytować rekord - dwuklik byłby lepszy :)

0

no tak, ale do listy wrzucam nazwę rekordu, a nie sam obiekt bo wtedy widniałyby krzaki. Więc w jaki sposób do listenera buttonu przekazać odpowiedni obiekt ?

0

utwórz sobie swój model listy rozszerzając klasę AbstractListModel i jego używaj.

A to, że pojawiają się krzaki wynika z faktu, że domyślnie lista wyświetla tekstową reprezentację obiektu - czyli to, co zwróci metoda toString. Przesłoń ją, tak aby zwracała żądane informacje.

0

to dlaczego są krzaki wiem dlatego mam problem z przekazaniem obiektu. szukam właśnie czegoś o pisaniu własnego modelu dla listy

0

http://java.sun.com/docs/books/tutorial/uiswing/components/list.html

rozszerzasz klasę AbstractListModel, implementujesz metody getElementAt oraz getSize. Musisz też zadbać o wywołanie odpowiednich metod fireXXX w momencie zmian w modelu (edycja, dodanie lub usunięcie rekordu).

0

mam taki własny ListModel

package core;

import javax.swing.AbstractListModel;
import java.util.List;
import java.util.ArrayList;

class ClientListModel extends AbstractListModel {
	
	public List cList;
	
	public void addElement(Client client) {
		if(cList.add(client)) {
			fireIntervalAdded(this, 0, getSize());
		}
	}
	
	public int getSize() {
		return cList.size();
	}
	
	public Object getElementAt(int index) {
		return cList.get(index);
	}
}

i takie wywołanie JList

listModel = new ClientListModel();
	    		
	    		for(int i = 0; i < clients.size(); i++) {
	    			Client client = (Client)clients.get(i);
	    			listModel.addElement(client);
	//    			frame.add(centerPanel, BorderLayout.CENTER);
	    		}
	    		cList = new JList(listModel);
	    		cList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	    		cList.setSelectedIndex(0);
	    		cList.setVisibleRowCount(5);

Wyświetla się fajnie bo do obiektu Client dodałem metodę toString()

Jednak dalej nie wiem jak przekazać obiekt. Chodzi mi o to, że jak wybiore coś z listy i klikne guzik to chce mieć obiekt a nie wartość z listy. Teraz jak klikam no mi się wyświetla np. gościu1, gościu2 jako String. Wykorzystuje do tego getSelectedValue(). Ja chce mieć dostęp do obiektu. Może coś mylę i gubię.

// EDIT

Poradziłem sobie. Zrobiłem rzutowanie

Client client = (Client)this.list.getSelectedValue();
0

jeszcze taka rada: jeżeli robisz to w javie 1.5 lub wyższej używaj parametryzowanych kolekcji. Parametryzowanie kolekcji umożliwia wykrycie pewnych błędów (jak np. dodanie obiektu niewłaściwego typu) już na poziomie kompilacji. Poza tym pobieranie obiektu nie wymaga wtedy rzutowania, np:

List<Client> clients = new ArrayList<Client>();
...
Client client = clients.get(i); //tu już nie trzeba rzutować
0

no tak, ale ja rzutuje to przy wyjęciu z JList a nie List.

Jednak faktycznie parametryzowanie kolekcji wygląda na dobrą sprawę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1