Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako proslediti varijablu ---- HTINO !!!!

[es] :: Java :: Kako proslediti varijablu ---- HTINO !!!!

[ Pregleda: 2198 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

normandija
Srbija

Član broj: 70439
Poruke: 364
91.191.59.*



+62 Profil

icon Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 12:06 - pre 157 meseci
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
Bolje izgubiti trenutak u zivotu,nego zivot u trenutku !!!
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 12:53 - pre 157 meseci
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;
}
 

 
Odgovor na temu

normandija
Srbija

Član broj: 70439
Poruke: 364
91.191.59.*



+62 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 13:07 - pre 157 meseci
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
Bolje izgubiti trenutak u zivotu,nego zivot u trenutku !!!
 
Odgovor na temu

serbolicious

Član broj: 258796
Poruke: 92
109.77.174.*



+47 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 13:23 - pre 157 meseci
moraju biti final
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 14:18 - pre 157 meseci
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..

 
Odgovor na temu

normandija
Srbija

Član broj: 70439
Poruke: 364
*.196.213.kr39.zona.ba.



+62 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 14:28 - pre 157 meseci
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
Bolje izgubiti trenutak u zivotu,nego zivot u trenutku !!!
 
Odgovor na temu

serbolicious

Član broj: 258796
Poruke: 92
109.77.174.*



+47 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 15:26 - pre 157 meseci
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".
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 15:55 - pre 157 meseci
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..

 
Odgovor na temu

normandija
Srbija

Član broj: 70439
Poruke: 364
*.196.213.kr39.zona.ba.



+62 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 16:06 - pre 157 meseci
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" ?
Bolje izgubiti trenutak u zivotu,nego zivot u trenutku !!!
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 16:31 - pre 157 meseci
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.
 
Odgovor na temu

normandija
Srbija

Član broj: 70439
Poruke: 364
*.196.213.kr39.zona.ba.



+62 Profil

icon Re: Kako proslediti varijablu ---- HTINO !!!!30.04.2011. u 16:37 - pre 157 meseci
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]
Bolje izgubiti trenutak u zivotu,nego zivot u trenutku !!!
 
Odgovor na temu

[es] :: Java :: Kako proslediti varijablu ---- HTINO !!!!

[ Pregleda: 2198 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.