[ normandija @ 30.04.2011. 12:06 ] @
Molim vas da mi pomognete, imam kod u koji prosledjujem varijablu iz druge metode, evo koda

Code:

private void makeCustomerButtons(JPanel panel, JComponent body, Card selection)
    {
        JButton button;
        button = new JButton("New");
        panel.add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                Card card = new Card();
                body.add(card, 0);
                selection = card;
                updateCost();
                repaint();
            }
        });


Na koji nacin da varijablu sleection i body procitam u okviru metode actionPerformed, jer mi je inace podvlaci ne moze da procita? a ona se mora citati iz druge klase tako da je ona samo prosledenje ovoj ovde sa implementacijom
[ biske86 @ 30.04.2011. 12:53 ] @
Problem je što java vrši prosleđivanje po vrednosti a po referenci. Kad se shvate te dve razlike onda postaje jasno u čemu je problem i kako ga rešiti.
To je odlično objašnjeno u knjizi CoreJava evo i primera pa pogledaj o čemu se radi.

Konkretno tvoj slučaj je Test 3, a treba da ga dovedeš na kao na Test 2 primeru.

Code (java):

public class ParamTest
{
   public static void main(String[] args)
   {
      /*
         Test 1: Metode ne mogu da modifikuju numeričke parametre
      */

      System.out.println("Testing tripleValue:");
      double percent = 10;
      System.out.println("Before: percent=" + percent);
      tripleValue(percent);
      System.out.println("After: percent=" + percent);

      /*
         Test 2: Metode mogu da promene stanje parametra objekta
      */

      System.out.println("\nTesting tripleSalary:");
      Employee harry = new Employee("Harry", 50000);
      System.out.println("Before: salary=" + harry.getSalary());
      tripleSalary(harry);
      System.out.println("After: salary=" + harry.getSalary());

      /*
         Test 3: Metode ne mogu da pridruže nove objekte parametrima objekta
      */

      System.out.println("\nTesting swap:");
      Employee a = new Employee("Alice", 70000);
      Employee b = new Employee("Bob", 60000);
      System.out.println("Before: a=" + a.getName());
      System.out.println("Before: b=" + b.getName());
      swap(a, b);
      System.out.println("After: a=" + a.getName());
      System.out.println("After: b=" + b.getName());
   }

   public static void tripleValue(double x) // doesn't work
   {
      x = 3 * x;
      System.out.println("End of method: x=" + x);
   }

   public static void tripleSalary(Employee x) // works
   {
      x.raiseSalary(200);
      System.out.println("End of method: salary="
         + x.getSalary());
   }

   public static void swap(Employee x, Employee y)
   {
      Employee temp = x;
      x = y;
      y = temp;
      System.out.println("End of method: x=" + x.getName());
      System.out.println("End of method: y=" + y.getName());
   }
}

class Employee // simplified Employee class
{
   public Employee(String n, double s)
   {
      name = n;
      salary = s;
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   private String name;
   private double salary;
}
 
[ normandija @ 30.04.2011. 13:07 ] @
ok, hvala za primer,ali nisam sam bas nesto ok otoga, pocetnik sam,ali ovo mi je hitno sad da mi neko kaze kako tacno treba,a posle cu da pozabavim tim detaljno
[ serbolicious @ 30.04.2011. 13:23 ] @
moraju biti final
[ biske86 @ 30.04.2011. 14:18 ] @
Citat:
serbolicious: moraju biti final

Ako se stavi final na parametar metode onda to znači da ne može da se menja taj parametar unutar metode.
Ti si možda mislio na to da kada se parametar metode deklariše kao final onda anonimne unutrašnje klase mogu da mu pristupaju. Ali opet samo da pročitaju a ne da ga menjaju što je ovde slučaj.

Citat:
normandija: ok, hvala za primer,ali nisam sam bas nesto ok otoga, pocetnik sam,ali ovo mi je hitno sad da mi neko kaze kako tacno treba,a posle cu da pozabavim tim detaljno

Nisi dao kompletan kod za klasu unutar koje se nalazi ova metoda makeCustomerButtons.
Obično se ovo radi ne tako što se prosleđuju ove promenljive nego što se one stave da budu promenljive klase.
Konkretno, ako se klasa čija je metoda makeCustomerButtons naziva CustomerFrame. Onda bi mogao da staviš da ima atribute:
Code (java):

public JPanel panel;
public Card selection;
 



Ali glavno pitanje je u kojoj klasi ti se nalazi ova metoda čiji si kod postavio. Daj malo više informacija pa možda ti neko i pomogne..
[ normandija @ 30.04.2011. 14:28 ] @
Evo ovako da bude jasnije, zakacio sam klase uz poruku, poenta je da e uradi refaktorisanje klasa, imaju 3 klase. Recimo da se razvrsta gde cemu mesto, u klasu Table u konstruktoru je natrpano svega pa recimo to staviti mozda u posebnu klasu, zatim metode koje se odnose na Cost isto mozda u posebnu klasu i metode za kreiranje dugmica staviti u klasu Buttons, ja sam to pokusavao,ali mi stalno nesto ne stima, pa ako bi to neko od vas mogao da pogleda ...

hvala unapred svima koji hoce da pomognu ........evo link

http://www.sendspace.com/file/twaowg
[ serbolicious @ 30.04.2011. 15:26 ] @
Citat:
Ako se stavi final na parametar metode onda to znači da ne može da se menja taj parametar unutar metode.
Ti si možda mislio na to da kada se parametar metode deklariše kao final onda anonimne unutrašnje klase mogu da mu pristupaju. Ali opet samo da pročitaju a ne da ga menjaju što je ovde slučaj.


Da u pravu si! Nisam video da hoce da menja referencu.

Kao sto neko rece: menjanje reference unutar metoda nije preporuceno (kao sto je slucaj uvek sa side-effects). Moja preporuka je da ovaj
Code:
Card selection
ne prosledjujes kao parametar i pokusavas da ga updateujes u listeneru nego da naknadno racunas novu vrednost za "selection".
[ biske86 @ 30.04.2011. 15:55 ] @
Sad su neke stvari jasnije. Znači ovaj kod je pisan onako što bi rekli s brda s dola. I sad je tebi profa dao zadatak da to malo urediš u skladu sa objektno orijentisanim principima, da se ne tumba sve u konstruktoru, da se jasno podele odgovornosti metoda itd.
E sad, samo još jedna stvar ovde nedostaje da bi probali da rešimo problem a to je kod koji si ti prepravio i u kom neće ova metoda. Ali čak i bez njega pretpostavljam šta si uradio, na osnovu sledećeg:
Citat:
normandija: ..a ona se mora citati iz druge klase tako da je ona samo prosledenje ovoj ovde sa implementacijom

Izmestio si ovu metodu makeCustomerButtons iz klase Table i stavio je u neku novu klasu. To je po meni pogrešan pristup pošto ta metoda obavlja nešto nad klasom Table i ona mora da stoji unutar te klase. Znači ta metoda treba da ostane tamo gde je i bila. Podsetio bi te samo da proučiš nešto vezano za enkapsulaciju. Citiraću ti rečenicu iz knjige Core Java:
Citat:

Ne može se dovoljno naglasiti činjenica da je ključ koji obezbeđuje da enkapsulacija radi, obezbeđivanje da metode nikada ne pristupaju direktno poljima primerka u nekoj drugoj klasi.

A ti upravo pokušavaš ovo da narušiš i zato mislim da je to loš dizajn.

Postoje neke druge stvari koje bi mogao da promeniš u ovom programu. Na primer iz aviona se vidi da treba ovu main metodu da izmestiš u posebnu klasu. Naravno može i ovako nabacano da radi ali je bolje da se odvoji posebno.
Na primer, najpre izbrišeš main metodu iz Table pa onda napraviš novu klasu:

Code:

import javax.swing.JFrame;


public class GlavniProgram {
    public static void main(String[] args){
        Table table = new Table();
        table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        table.setVisible(true);
    }
}


Takođe treba da skineš:
this.show();
zato što se to od 1.5 verzije ne koristi već metoda setVisible(true);

itd, itd..
[ normandija @ 30.04.2011. 16:06 ] @
Lepo si to objasnio zaista hvala na strpljenju. Znaci ipak sam pogresio ....ok,znaci po tebi bi trebalo ostaviti metode za kreiranje dumcica u klasi Table jer im je tu i mesto, i meni je to sada lognicnije kada si mi malo pojasnio ....ja sam napravio novu klasu Cost i premestio u nju sve vezano za to, sad ne znam sta bih jos mogao da rasclanim kako bi to bilo kako kazes "uredno" ?
[ biske86 @ 30.04.2011. 16:31 ] @
Citat:
normandija: Lepo si to objasnio zaista hvala na strpljenju. Znaci ipak sam pogresio ....ok,znaci po tebi bi trebalo ostaviti metode za kreiranje dumcica u klasi Table jer im je tu i mesto, i meni je to sada lognicnije kada si mi malo pojasnio ....ja sam napravio novu klasu Cost i premestio u nju sve vezano za to, sad ne znam sta bih jos mogao da rasclanim kako bi to bilo kako kazes "uredno" ?


Čuj, ja samo kažem da se meni čini da je trebala ta metoda da ostane u klasi Table, ali ipak se ograđujem da te ne naučim nešto pogrešno, pošto sam i sam početnik. Zato bi bilo dobro da se javi neko iskusniji da kaže svoje mišljenje.
[ normandija @ 30.04.2011. 16:37 ] @
ok, hvala u svakom slucaju za pomoc, nadam se da ce s eneko javiti da ovo resim ....evo ja kacam kod koji sam ja pokusao srediti, ne mogu nikako da resim premestanje button-a u drugu klasu i poziv istih u table klasi, ako mi neko moze to objasniti

http://www.sendspace.com/file/54c5ff

[Ovu poruku je menjao normandija dana 30.04.2011. u 18:22 GMT+1]