Mam pewną metodę, która ma w przyszłości zmieniać kontrast obrazu, pracującą na BufferedImage. W jej wnętrzu tworzony jest obiekt mojej klasy ToolsSliderPane dziedziczącej po JDialog. Chciałbym zaimplementować podgląd "na żywo" zmiany kontrastu za pomocą suwaka, więc stworzyłem klasę anonimową implementującą interfejs Runnable - żeby jednocześnie działał JDialog z suwakiem i w tym samym czasie móc odczytywać jego stany. Testowy kod (wiem, że brakuje breaka, ale eclips wywalił błędy zanim do tego doszedłem) wyglądał następująco:

public BufferedImage contrast(BufferedImage img)
	{		
		BufferedImage pImg = new BufferedImage(img.getColorModel(), img.copyData(null), img.isAlphaPremultiplied(), null);
		ToolsSliderPane contrastPane;
		
		Thread thread = new Thread(new Runnable()
		{
			public void run()
			{
				while(true)
				{
					if(contrastPane != null)
					{
						if(contrastPane.getOkButtonStatus())
							contrastPane.dispose();
					}
				}
			}
		});
		
		thread.start();
		
		contrastPane = new ToolsSliderPane(0, 255, "Ustewienia kontrastu");
		
		return pImg;
	}

No i pojawił się problem, bo aby móc odwoływać się do contrastPane musi to być pole z modyfikatorem final. Nie mogę jednak zainicjować tego pola przed wywołaniem thread.start(), bo wówczas zatrzyma to wykonywanie głownego wątku, i thread.start() odpali dopiero po zamknięciu contrastPane.

Próbowałem zrobić odwrotnie - tj. testowo w nowym wątku stworzyłem contrastPane, a w głównym dałem pętlę liczącą od 1 do 5 co sek. Wynik był taki, że contrastPane utworzył się z pustą zawartością, która wypełniła się dopiero po zakończeniu pętli z wątku głównego.

Moje pytanie jest więc takie - czy w ogóle da się zrobić to co chcę za pomocą wewnętrznej klasy anonimowej ? (jeśli tak, to jak?) Czy muszę tworzyć osobny plik i nie martwić się wtedy o słówko "final"?