Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Witam

Czy rozwiązaniem są pola i metody statyczne? Jest sobie GUI. Wywołuję z niego okno dialogowe ustawień. I np. klikam na opcję dodawania i usuwania kolumny w tabeli - chcę żeby to się robiło w trybie natychmiastowym (najpóźniej po kliknięciu w przycisk OK tego okna dialogowego ustawień). Podsuniecie mi na to jakieś pomysły?

Pozdrawiam
Mariusz

konto usunięte

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

.Robert T. edytował(a) ten post dnia 25.07.11 o godzinie 02:50

konto usunięte

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Dwa podstawowe rozwiązania: singleton i listenery.

Singleton: czynisz z obiektu odpowiedzialnego za zarządzanie tabelą z dialogu singleton i odwołujesz się do niego (np. przez statyczny getter) bezpośrednio.

Listenery: tworzysz interfejs z metodą np. notifyTableChanged(List<?> contents), niech w.w. obiekt ma listę takich interfejsów, po zmianie tabeli musi wywołać na wszystkich zarejestrowanych na liście obiektach w.w. metodę. Wówczas lista zmian się rozpropaguje, niemalże, sama. Pamiętaj tylko, by upewnić się, że ta metoda wywoływana jest przez ten wątek, który chcesz, żeby była wykonywana.

konto usunięte

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Mariusz P.:
chcę żeby to się robiło w trybie natychmiastowym
Bedziesz to odkrecal jak user nacisnie Cancel? W sumie to pytanie jak bardzo "User Friendly" chcesz byc...
Edit:
A reszta b. ładnie opisana w poscie powyzejWlodzimierz Mazur edytował(a) ten post dnia 26.10.10 o godzinie 13:05
Adrian N.

Adrian N. Informatyk

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

witam

ja bym dodal nowy widok do controllera ;)

ewentualnie przekazac obiekt z modelem tabeli do okienka z opcjami i juz sobie mieszac nim w odpowiedzi na zdarzenia

pozdrawiamAdrian Nowak edytował(a) ten post dnia 26.10.10 o godzinie 16:25
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

ja bym dodal nowy widok do controllera ;)

ewentualnie przekazac obiekt z modelem tabeli do okienka z opcjami i juz sobie mieszac nim w odpowiedzi na zdarzenia

Zbyt ogólnikowo! Co ma być kontrolerem, a co widokiem? Jak? Model tabeli? Jestem na poziomie SWT i tu chyba nie ma żadnych modeli. JFace oferuje chyba już na standardową kontrolkę w SWT jakiś model (chyba dość skromny). Moja wiedza na temat modeli jest praktycznie zerowa. Przekazywać obiekt (całe główne okno programu) do dialogu - to chyba bez sensu? Jak miałoby to wyglądać? Nie wiem czy mi to akurat obecnie potrzebne, ale gdzie znajdę coś na ten temat więcej? Przy okazji zapytam do czego służą wiązania (bindings) w SWT? Przy projektowaniu GUI bazowałem trochę na SWT Designer (pakiet Google WindowBuilder Pro). Jak na razie wzorców nie wykorzystywałem żadnych, ale zastanowię się nad nimi. Sugerowano mi tez Mediatora. Jak bardzo chcę być "user friendly"? Maksymalnie ile się da. To jest projekt szkoleniowy. Nikt oprócz mnie nic mi nie narzuca. Ograniczeniami są jedynie wiedza, doświadczenie i praktyka. Oczywiście nie wszystko naraz i nie z grubej rury bo to zniechęca. Mile widziane są jak najprostsze rozwiązania. Tabela była jedynie przykładem. Równie dobrze może być to jakiś inny element głównego GUI zmieniany z poziomu okna preferencji. Na sposób z listą interfejsów przydałby się jakiś przykład obrazujący działanie. Co do singletonów to rozumiem, że to jest właśnie rozwiązanie bazujące na podejściu statycznym - tak jak sugerowałem w pierwszym poście?Mariusz P. edytował(a) ten post dnia 26.10.10 o godzinie 21:53

konto usunięte

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Mariusz P.:
Na sposób z listą interfejsów przydałby się jakiś przykład obrazujący działanie.

pisane bez edytora, poglądowo:


class TableRow { ... }

interface TableDataChangedListener {
public void tableDataChanged(List<TableRow> currentObjects)
}

class DataModel {
List<TableRow> currentItems;
List<TableDataChangedListener> tableDataChangedListeners;

public void changeData() {
...
notifyDataChanged();
}

public void notifyDataChanged() {
List<TableRow> copy = Collections.list(currentItems);
new Thread() { public void run() {
for (TableDataChangedListener l: tableDataChangedListeners) {
l.tableDataChanged(copy);
}}
}.start();
}
}

Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Hmm. Może inaczej. Załóżmy, że mam stworzone już dwa różne obiekty (na podstawie różnych klas). Chciałbym zmodyfikować pewien element znajdujący się w tym stworzonym obiekcie A z poziomu obiektu B. Jak odwoływać się do metod w istniejącej już klasie A z poziomu klasy B? Utworzyć je jako statyczne? Wykorzystać mechanizm refleksji?
Adrian N.

Adrian N. Informatyk

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Czy Pańskie pytanie dotyczy nadal wątku głównego?
Może po prostu proszę umieścić kod programu, łatwiej będzie pomóc :)

Z wykorzystaniem metod klasy B z obiektu klasy A nie ma najmniejszego problemu, to zwykła kompozycja.
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Ok podaje przykład:


package pl.pakiet;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class KlasaA {

protected Shell shell;
private Text txtTest;

public static void main(String[] args) {
try {
KlasaA window = new KlasaA();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}

public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}

protected void createContents() {
shell = new Shell();
shell.setSize(450, 300);
shell.setText("SWT Application");
txtTest = new Text(shell, SWT.BORDER);
txtTest.setText("TEST");
txtTest.setBounds(171, 110, 76, 21);
Button btnZmianaTekstu = new Button(shell, SWT.NONE);
btnZmianaTekstu.setBounds(157, 158, 117, 25);
btnZmianaTekstu.setText("ZMIANA TEKSTU");
btnZmianaTekstu.addSelectionListener(new SelectionAdapter( ) {
public void widgetSelected(SelectionEvent e) {
KlasaB dialog = new KlasaB(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
dialog.setA(KlasaA.this);
dialog.open();
}
}); }
public void zmienTekst(String tekst) {
txtTest.setText(tekst);
}
}

package pl.pakiet;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class KlasaB extends Dialog {

protected Object result;
protected Shell shell;
protected KlasaA referencjaNaKlaseA;

public KlasaB(Shell parent, int style) {
super(parent, style);
setText("SWT Dialog");
}

public Object open() {
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
void setA(final KlasaA a){
referencjaNaKlaseA = a;
}
private void createContents() {
shell = new Shell(getParent(), getStyle());
shell.setSize(450, 300);
shell.setText(getText());
Button button = new Button(shell, SWT.NONE);
button.setBounds(172, 85, 75, 25);
button.setText("New Button");
button.addSelectionListener(new SelectionAdapter( ) {
public void widgetSelected(SelectionEvent e) {
referencjaNaKlaseA.zmienTekst("UDAŁO SIĘ!");
}
});

}
}


Po wciśnięciu przycisku "New button" w oknie dialogowym, ma się zmienić napis w etykiecie w oknie głównym z "TEST" na "UDAŁO SIĘ". Powyższe rozwiązanie już mi działa, ale może znacie jakieś bardziej eleganckie?Mariusz P. edytował(a) ten post dnia 03.01.11 o godzinie 14:57
Adrian N.

Adrian N. Informatyk

Temat: [SWT] Jak modyfikować własności obiektu/głównego okna...

Jeśli to musi tak wyglądać, tzn dwa "okienka" to OK.

W klasie B setA jest zbędna, śmiało można przekazać parametr w konstruktorze.

Dodatkowo, ja bym zamiast całej klasy przekazywał samą kontrolkę.
Konstruktor przyjmowałby postać:

public B(JTextField btnZmianaTekstu_,Display shell_, Integer style) {
super(shell_,style_);
}

Jeśli jednak klasa B ma wyświetlać sam Button, może warto użyć czegoś innego?
Chociażby JOptionPane() ?

Z drugiej strony jeśli działa, to lepiej już nie ruszać :))
Pozdrawiam,
Adrian



Wyślij zaproszenie do