zmienna a klasa wewnętrzna w GWT

0

Witam!

stanąłem przed następującym problemem - mam pewną pętlę, która tworzy listę obiektów i dla kazdego obiektu chciałbym wygenerować button, który wykona pewną funkcję w oparciu o ID danego obiektu. na razie wygląda to tak:

      while(ite.hasNext()){
            CarDTO temp = (CarDTO)ite.next();
            HorizontalPanel HPan = new HorizontalPanel();

            

            HPan.add(new HTML(temp.getMark()));
            HPan.add(new HTML(temp.getModel()));
            HPan.add(new HTML(temp.getYear().toString()));
            HPan.add(new Button("Szczegóły", new ClickHandler() {
                
                
                @Override
                public void onClick(ClickEvent event) {
                   funkcja(temp.getCosTam);
                }
            }));

            HPan.setStyleName("carListTable");
            carsPanel.add(HPan);
        }

problem jest natury "jak przekazać do funkcji onClick dane z temp.getCosTam" - kompilator odmawia bez deklarowania tempa jako final, a to chyba w grę nie wchodzi, gdyż jesli dobrze rozumiem zmienne final mozna deklarowac tylko raz.

0

A nie wygodniej stworzyć sobie małą klasę, nawet wewnętrzną, reprezentującą panel wyświetlający obiekty CarDTO i przekazywać do jej konstruktora obiekt CarDTO? Takie coś w ten deseń:

class CarViewer extends Composite{

   public CarViewer(CarDTO car){
    //...
   }

}

// edit button ma handlera, który jest klasą ANONIMOWĄ, a nie WEWNĘTRZNĄ

0

Koziołek dzięki :) jednak miej na uwadze, że ja dopiero zaczynam z programowaniem :)

ogólnie czy wygodniej nie wiem - chyba na jedno wyjdzie gdzie będzie logika wyświetlania panelu, czy pewnie się myle ? na pewno jest to coś co warto rozważyć dla przejrzystości kodu. jednak to i tak nie rozwiązuje problemu.

a co do wewnętrzna/anonimowa - NetBeans twardo rzuca że klasa jest wewnętrzna i nie chce przyjąć tempa jesli ten nie będzie finalny. więc moje pytanie jak to obejść ? :)

0

No nie na jedno. Najprostszy model to stworzenie sobie mini panelu. Łatwiej nim zarządzać i modyfikować w przyszłości.
Możesz też zrobić jeszcze jedną rzecz:

class CarDTOHandler implements ClickHandler{
   private CarDTO carDTO;

   public CarDTOHandler(CarDTO carDTO){
      this.catDTO = catDTO;
   }

  @Override
   public void onClick(ClickEvent event) {
       funkcja(carDTO.getCosTam);
   }
}

I następnie:

HPan.add(new Button("Szczegóły", new CarDTOHandler(temp));
0

zmienne final mozna deklarowac tylko raz
Właściwie to wszystkie zmienne można deklarować tylko raz. Jeśli nie musisz w bloku while zmieniać wartości temp, to śmiało możesz zadeklarować ją jako final. Choć lepszym wyjściem wydaje się być to Koziołka.

0

ooo i takie rozwiązanie ogarniam :) dzięki serdeczne.

0

w sensie te koziołkowe :)

a co do final - nie wiem, wydawało mi się to niepoprawne. oczywiscie tempa nie muszę modyfikować, i teoretycznie mógłbym tam walnąć final - tylko czy jak pętla będzie lecieć i za kazdym wykonaniem do tempa wkladac kolejna wartosc, to nie będzie to hmmm... jakimś zagrożeniem? jestem na etapie uczenia i staram się sobie wypracować że tak powiem "słuszne nawyki" i myślę że brak nadużywania finali takim jest.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.