SWT, widget is disposed

0

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?

0

Sobie z tym poradziłem, ale mam pytanie do tych komponentów. Jeśli tworzą mi się one w konstruktorze klasy. To jak mam uzyskać dostęp do nich z osobnej metody? Tak jak w przykładzie wyżej? Muszę przenosić deklaracje tych komponentów pod Klasę, aby mieć do nich dostęp, czy stosuje się jakieś inne metody?

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