Odwoływanie się do zmiennej innej klasy

0

Witam,
mój problem może wydawać się banalny, ale walczę z nim już cały dzień...
Otóż w NetBeans wstawiam sobie JAppletForm, na formularzu umieszczam jTextField1, który NetBeans automatycznie ustawia na private, bez możliwości zmiany. Tworzę sobie teraz drugą klasę o nazwie NowaKlasa i chciałbym z poziomu NowaKlasa wykonać np.

JAppletForm.jTextField1.setText("czesc");

oczywiście nie mogę tego zrobić, bo zmienna jTextField1 jest niewidoczna w klasie NowaKlasa, próbowałem zrobić metodę "pośredniczącą" w JAppletForm, która wykona ten setText i będę mógł wywołać ją z NowaKlasa, jednak żeby taka metoda mogła odwołać się do prywatnej zmiennej jTextField1, to sama musi być prywatna, tak więc nie mogę jej wywołać z NowaKlasa...

Jak tego dokonać? Jak odwołać się do prywatnej zmiennej w innej klasie?

0

jednak żeby taka metoda mogła odwołać się do prywatnej zmiennej jTextField1, to sama musi być prywatna
Ciekawe rzeczy mówisz. Oczywiście wiesz, że metodę musisz wywołać z obiektu, a nie z klasy?

0

iooi, jak miałoby to wyglądać w praktyce?

w NowaKlasa:

JAppletForm obiekt = new JAppletForm();

I dalej:

obiekt.wstawtekst();

Wybaczcie mój brak wiedzy, ale dopiero się ucze programowania obiektowego...

0

I nie działa tak? wstawtekst robisz publiczną, a w niej wywołujesz jTextField1.setText

0

Nie działa... Tak to wygląda:

fragment JAppletForm:

    public void wstawtekst()
    {
        jTextField1.setText("czesc");
    }

i cały kod klasy NowaKlasa:

public class NowaKlasa
{
   JAppletForm obiekt = new JAppletForm();
   static public void main(String args[])
       {
           obiekt.wstawtekst();
       }
}

Nie mogę tego skompilować, w miejscu obiekt.wstawtekst(); otrzymuję: non-static variable obiekt cannot be referenced from a static context

0

No bo odwołujesz się do obiekt z metody statycznej, czyli to, o czym mówiłem w pierwszym poście.
Albo niech obiekt będzie tworzony w main, albo stwórz jakąś instancję NowaKlasa.

0

Teraz mam tak:

public class NowaKlasa
{
   static public void main(String args[])
       {
           JAppletForm obiekt = new JAppletForm();
           obiekt.wstawtekst();
       }
}

program skompilował się, jednak wywala błąd w NowaKlasa:

Exception in thread "main" java.lang.NullPointerException
        at JAppletForm.wstawtekst(JAppletForm.java:18)
        at NowaKlasa.main(NowaKlasa.java:6)
Java Result: 1
0

jTextField1 jest prawdopodobnie nullem w momencie wywołania. Gdzie i kiedy inicjalizujesz to pole?

0

Nie możliwe, JAppletFrame mam już uruchomiony, potem dopiero uruchamiam NowaKlasa, więc jTextField1 nullem na pewno nie jest...
Na jutro muszę mieć to gotowe, bo jutro jest termin oddawania projektów z javy, napisałem wielowątkowego czata w klient-serwer w operciu o UDP, cały kod mam już gotowy, teraz tylko wyświetlanie otrzymanej wiadomości w jTextFieldzie, myślałem, że to błahostka...

0

Miałem na myśli "niemożliwe", aczkolwiek sprawdziłem i okazało się, że jak najbardziej możliwe, jTextField1 jest null

JAppletForm:

public class JAppletForm extends javax.swing.JApplet {

    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


    public void wstawtekst()
    {
        jTextField1.setText("czesc");
    }


   /*wyciety kawalek wygladu formularza*/             


    // Variables declaration - do not modify                     
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   

}

No i NowaKlasa (juz wczesniej dawalem, ale dam jeszcze raz):

public class NowaKlasa
{
   static public void main(String args[])
       {
           JAppletForm obiekt = new JAppletForm();
           obiekt.wstawtekst();
       }
}
0

Powinno pomóc

    public void init() {
        initComponents();
    }

Na pewno pomoże

 
 
    public void wstawtekst()
    {
        if(jTextField1!=null){
            jTextField1.setText("czesc");
        }
    }

Z ciekawości spytam, jak to masz zorganizowane? Klasa JAppletForm jest apletem jest więc uruchamiana przez przeglądarkę. Jak są tworzone obiekty klasy NowaKlasa? Jakim cudem one widzą w pełni zbudowane obiekty klasy JAppletForm?

0

bogdans, NowaKlasa to wątek klasy JAppletForm, który w pętli czeka na wiadomości od serwera. Zastosowałem się do Twoich wskazówek i niestety nie pomogło, po prostu nie ma błędu przy uruchomieniu NowaKlasa, czyli warunek jTextField1!=null nie został spełniony (dałem initComponents(); w init JAppletForm)

0

Nie rozumiem organizacji Twojego programu. Wątki z metodą main()? Ty uruchamiasz program w przeglądarce? Jeżeli nie, to metoda init() się nie wykona automatycznie, musisz ją wywołać. Tylko nie rozumiem po co wtedy aplety.

public class NowaKlasa
{
   static public void main(String args[])
       {
           JAppletForm obiekt = new JAppletForm();
           obiekt.init();
           obiekt.wstawtekst();
       }
}
0

NowaKlasa to tylko wymyślony przykład na potrzeby zobrazowania problemu, oczywiście wątek nie ma main'a.

Coś mi tutaj jednak nie pasuje, załóżmy, że w JAppletForm utworzyłem globalną zmienną

public int p = 50;

niżej piszę metodę, która zmiena wartość p na 100:

    public void zmien()
    {
        p=100;
    }

uruchamiam JAppletForm, widzę ładny formularz na ekranie, zatem wszystko zostało zainicjalizowane, następnie uruchamiam NowaKlasa, która wygląda następująco:

public class NowaKlasa
{
   static public void main(String args[])
       {
           JAppletForm obiekt = new JAppletForm();
           obiekt.zmien();
           System.out.println("p="+obiekt.p);
       }
}

W tym momencie System.out.println wypisuje mi w NowaKlasa p=100, po tej operacji w JAppletForm wyświetlam sobie w jakikolwiek sposób zmienną p, jest ona równa nadal 50, czyli tyle, ile dałem przy inicjalizacji, zatem jak z poziomu obiektu mam "zaingerować" w zmienną, która jest w klasie głównej? (Analogiczny przykład do wpisania tekstu do jTextFielda w JAppletForm z poziomu obiektu w innej klasie)

0
    public void zmien()
    {
        p=100;
        System.out.println(p);
        //i tu się pojawia 50?, nie wierzę
    }

Jeżeli wyświetlasz w innym miejscu, to skąd wiesz, że wyświetlasz po wykonaniu metody zmien()?

0

Pewnie robisz to w ten sposób: masz klasę dziedziczącą po JApplet i jej obiekt jest normalnie tworzony i odpalany w przeglądarce, a w wątku, który ma coś robić tworzysz zupełnie inny obiekt tej samej klasy, a skoro to są ZUPEŁNIE różne obiekty to trudno, żeby zmiana w jednym dokonywała się też w drugim.

W wątku nie możesz tworzyć nowej instancji tej klasy, ale przekazać mu referencję do niej! I pamiętaj o synchronizacji!

0

ale przekazać mu referencję do niej

No właśnie, problem rozwiązany, zapomniałem o istnieniu czegoś takiego. A w jakim celu miałbym synchronizować wątki w chacie?

0

Nie wiem jak to u Ciebie wygląda, ile masz wątków, jak się posługujesz współdzielonymi zasobami, ale pamiętaj, żeby w tym samym czasie nie pisać i czytać tych samych zasobów!

1 użytkowników online, w tym zalogowanych: 0, gości: 1