Witam. Piszę sobie interfejs, który zawiera wyszukiwarkę i napotkałem na pewien problem. Do tworzenia GUI używam WindowsBuildera. Poprzeciągałem komponenty itp. Mój problem polega jednak na tym, że po wciśnięciu przycisku szukaj potrzebuję pobrać wartości z Textów, Sliderów, czy też Combo. Jednak te komponenty są tworzone w konstruktorze klasy, a żeby pobrać je potrzebuję jakiejś zewnętrznej metody, która po wciśnięciu przycisku szukaj zostanie wywołana i pobierze mi wartości z tych komponentów. I tutaj właśnie napotykam na ten problem. Jeśli komponenty są tworzone w konstruktorze to nie mogę pobrać ich z innej metodzie bo ich ona zwyczajnie nie widzi... Próbowałem sobie pomagać i deklarować te komponenty pod klasą. Wygląda to u mnie wszystko tak(pokaże to na 1 komponencie Text, żeby nie rozpychać forum zbędnym kodem)
public class Ksiegarnia {
private ArrayList<Ksiazka> listaKs = new ArrayList<Ksiazka>();
private ArrayList<Ksiazka> znalKs = new ArrayList<Ksiazka>();
private Label kategoriaWybor;
private static int ktory = 0;
Display display = Display.getDefault();
----Konstruktor tworzone są w nim wszystkie komponenty jakie przeciągałem
public Ksiegarnia(Display display) {
Shell shell = new Shell(SWT.SHELL_TRIM & (~SWT.RESIZE));
shell.setSize(800, 650);
shell.setText("Ksiegarnia");
shell.setBounds(200, 10, 800, 650);
Device device;
----------nasz komponent text
private Text text;
text = new Text(shell, SWT.BORDER);
text.setBounds(10, 135, 150, 21);
----------reszta komponentów jak slidery, texty, combo
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
wyszukaj();------metoda szukająca wywoływana też na początku żeby wyświetlić wszystko
}
Metoda wyszukaj:
/**
* Metoda wyszukująca ksiażki wg. podanych kryteriów
*/
public void wyszukaj(ArrayList<Ksiazka> ksLista) {
liczba = 0;
znalKs.clear();
-----------W tym miejscu sygnalizowany jest błąd przy próbie pobrania wartości getText(), że komponent został zwolniony.
if(text.getText().equals("")) {
text.setText("...");
}
if(text_1.getText().equals("")) {
text_1.setText("...");
}
if(text_2.getText().equals("")) {
text_2.setText("...");
}
for(Ksiazka x : ksLista) {
if ((text.getText().equals(x.tytul) || text.getText().equals("..."))
&& (text_1.getText().equals(x.autor) || text_1.getText().equals("..."))
&& (kategoriaWybor.getText().equals(x.kategoria) || kategoriaWybor.getText().equals("Wszystkie"))
&& ((Double.parseDouble(cenaOd2.getText()) <= x.cena) && (Double.parseDouble(cenaDo2.getText()) >= x.cena))
&& (oprawaCombo.getData().equals(x.oprawa) || oprawaCombo.getData().equals("Dowolna"))
&& (Integer.parseInt(stronyOd2.getText()) <= x.strony) && (Integer.parseInt(stronyDo2.getText()) >= x.strony)
&& (text_2.getText().equals(x.wydawnictwo) || text_2.getText().equals("...")))
{
znalKs.add(x);
liczba++;
}
}
ktory = 0;
if(liczba == 0) {
znalKs.addAll(listaKs);
liczba = listaKs.size();
wyswietl(znalKs.get(ktory));
} else {
wyswietl(znalKs.get(ktory));
}
}
I właśnie aby otrzymać możliwość pobrania wartości z komponentu Text muszę przenieść jego deklarację z konstruktora pod klasę tak:
public class Ksiegarnia {
private Text text;
private ArrayList<Ksiazka> listaKs = new ArrayList<Ksiazka>();
private ArrayList<Ksiazka> znalKs = new ArrayList<Ksiazka>();
private Label kategoriaWybor;
private static int ktory = 0;
Display display = Display.getDefault();
Main:
public static void main(String[] args) {
Display display = new Display();
new Ksiegarnia(display);
display.dispose();
}
Po uruchomieniu programu dostaję jednak błąd, że komponenty został zwolniony i zaznaczane są mi linijki, gdzie jest text.getText() i przy wywołaniu wyszukaj():
Exception in thread "main" org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4361)
at org.eclipse.swt.SWT.error(SWT.java:4276)
at org.eclipse.swt.SWT.error(SWT.java:4247)
at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
at org.eclipse.swt.widgets.Text.getText(Text.java:1327)
at Ksiegarnia.wyszukaj(Ksiegarnia.java:419)
Co zrobić? Czemu ten komponent jest zwalniany? W Swingu takie coś przeszło i podobny interfejs działał. Jak zrobić z tymi komponentami, żeby uzyskać do nich dostęp z metody tak jak ta np. wyszukaj? Jeśli wszystkie komponenty tworzą się w konstruktorze? Czy powinienem to wszystko zrobić w ogóle w jakiś inny sposób?