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"?