Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Jak wykorzystać zmienną z jednego słuchacza w innym?

GUI koduję w SWT. Mam jeden słuchacz, który otwiera directoryDialog. Filtruję tam również pliki pod kątem danego rozszerzenia i podaję na wyjściu (na etykietę) listę tych plików. W drugim słuchaczu chciałbym już tylko zliczać ilość tych plików i nazwę każdego wypisywać w tabeli. Czy można pewne elementy z jednego słuchacza wykorzystać w innym (głównie zmienne)? Sugerowano mi, żeby założyć nowe klasy implementujące listenera, skorzystać z wzorca mediator, zrobić dziedziczenie klas, zaimplementować własne klasy listenerów itd. Nie wiem tylko, czy to nie jest za dużo dla mnie teraz i czy to wszystko potrzebne. Może da się jakoś prościej? Jak strzelanie do muchy z armaty. Mam nadzieję, że się nie narzucam. Chodzi mi w sumie o ogólne wskazówki co mam teraz zastosować i jakim torem pójść.


final Text text2 = new Text(group2, SWT.MULTI | SWT.V_SCROLL);
text2.setEditable(false);
{
FormData data = new FormData();
data.right = new FormAttachment(100);
data.left = new FormAttachment(0);
data.top = new FormAttachment(group1,5);
data.bottom = new FormAttachment(100,-5);

text2.setLayoutData(data);
text2.setBackground(text2.getDisplay().getSystemColor(SWT.COLOR_WHITE));
/*Display display = Display.getDefault();
text2.setBackground(new Color(display, new RGB(255, 0, 0)));*/
}
button1.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event e) {
DirectoryDialog directoryDialog = new DirectoryDialog(shell, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
directoryDialog.setText("Przeglądanie w poszukiwaniu folderu");
directoryDialog.setMessage("Wybierz katalog");
try {
String selectedDirectory = directoryDialog.open();
if (selectedDirectory != null) t1.setText(selectedDirectory);
DirList listFiles = new DirList();
String fileType = ".*"+File.separatorChar+".mp3";
String[] filterFiles = listFiles.getDirList(fileType, selectedDirectory);
if (filterFiles.length == 0) text2.setText("Brak plików mp3 w wybranym katalogu.");
else text2.setText("");
for (String file : filterFiles) {
text2.append(selectedDirectory+File.separatorChar+file+"\n");
}
}
catch (NullPointerException ex) {
text2.setText("Nie wybrano żadnego katalogu.");
}
}
});
Mariusz P. edytował(a) ten post dnia 08.03.10 o godzinie 23:35
Adam Foltyn

Adam Foltyn architekt /
programista - java

Temat: Jak wykorzystać zmienną z jednego słuchacza w innym?

Hmmm, a nie możesz tego robić w tym pierwszym?? Tzn wypisać w pętli do tego text-a a potem ustawić jako input do tabeli.
Zawsze możesz też korzystać ze zmiennych formularza/dialogu czy co tam masz.
Możliwe że nie zrozumiałem problemu, jak chcesz to prześlij mi kod tego formularza z tym drugim listenerem i zaznaczonym TODO w miejscu gdzie chcesz coś zrobić
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Jak wykorzystać zmienną z jednego słuchacza w innym?

Tylko, że zawartość tabeli musiałaby się pokazywać dopiero po naciśnięciu kolejnego buttonu, który ma w/g mnie mieć za zadanie:
1. przełączyć do nowej zakładki (tab);
2. przeprowadzić różne operacje na plikach, które zostały we wcześniejszym zdarzeniu wybrane (a dokładnie zliczenie ich, czytanie metadanych mp3 (tagi )idv3 dla każdego pliku i wyświetlenie informacji w tej tabeli o każdym pliku (kolejne kolumny tabeli to nazwa pliku i tagi). Zmienna z dialogu w tym pierwszym listenerze przechowuje tylko ścieżkę do katalogu.
Adrian C.

Adrian C.
projektant/programis
ta

Temat: Jak wykorzystać zmienną z jednego słuchacza w innym?

Ogólnie to jesli dobrze odczytuje Twoje intencje, próbujesz za pomoca kontrolek UI trzymać stan jakiś danych w tym przypadku danych o plikacz. Czy nie korzystniej byłoby zrobić beana np. MP3directory z dwoma polami:
String path - sciezka do folderu
String[] files - odfiltrowane pliki.
Bean ten byłby Twoim modelem danych wyświetlanym przez UI.

button1 - robiłby te wszystkie operacje co robi i zaktualizowałby beana o sciezke i tablice plikow.
Bean o kazdej zmianie powinien powiadamiac UI, czyli listenera/listenery który odświeży odpowiednie kontrolki.

button2 - odczytałby dane z bena oraz metadane plików i zaktualizował beana o te dane(musialbys go rozszerzyc) albo wyświetliłby metadane bezpośrednio do UI. Osobiście proponowałbym rozszerzenie beana.
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Jak wykorzystać zmienną z jednego słuchacza w innym?

Cóż, jak jedno ok, to drugie już nie działa. W implementacji listenerów nie mogę się odwoływać do widżetów. OK, rozumiem oddzielnie logiki od interfejsu, ale co jak logika ma wpływać właśnie na interfejs? Problem pozwoliłem sobie zobrazować poniżej (to co udało mi się uzyskać przy pomocy pana Adama, również podobną metodologię tworzenia kodu ma WindowsBuilder):


private void initControls() {

Button btnSend = new Button(this, SWT.PUSH );
Button btnRead = new Button(this, SWT.PUSH );
btnSend.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
handleBtnSendSelected(e);
}
});

btnRead.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
handleBtnReadSelected(e);
}
});
}

String[] filterFiles = null;

protected void handleBtnSendSelected(SelectionEvent e) {
// implementacja
String[] filterFiles = listFiles.getDirList(fileType, selectedDirectory);
//TODO:
// btnRead.setText("Czytaj"); - to mi już tutaj nie zadziała
}

protected void handleBtnReadSelected(SelectionEvent e) {
// implementacja
int count = i tu cos robie ze zmienna filterFiles
//TODO:
// btnSend.setText("Wyślij"); - to mi już tutaj nie zadziała
}

Następna dyskusja:

jak to napisać w j2ee




Wyślij zaproszenie do