• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Słówko kluczowe this przy JButton

Object Storage Arubacloud
0 głosów
205 wizyt
pytanie zadane 28 grudnia 2017 w Java przez rubesom Obywatel (1,690 p.)

Hej

Wracam z pytaniem o słówko "this", w takim przykładzie:

przycisk.addActionListener(this);

Dzięki temu dodałem "przycisk" jako odbiorcę zdarzeń ale jak dokładnie działa w tym przypadku "this"?

 

1 odpowiedź

+1 głos
odpowiedź 29 grudnia 2017 przez mbabane Szeryf (79,280 p.)

Wydaje mi się, że jak w każdym innym przypadku (wykluczając wywoływanie innych konstruktorów tej samej klasy z konstruktorów). Przekazujesz dokładnie ten obiekt (jego instancje), w którym została wykonana prezentowana przez Ciebie linijka. W tym konkretnym przypadku ta klasa, która jest pod this (a w zasadzie to będzie już raczej obiekt) zdaje się, że dodatkowo musi implementować interfejs ActionListner.

komentarz 29 grudnia 2017 przez rubesom Obywatel (1,690 p.)

Jakoś tego nie łapie...

Używam this w przypadku kolidowania nazw i przy wywoływaniu konstruktorów, z tego co napisałeś to rozumiem, że przekazuje on referencję do samego siebie.

W tym przykładzie:

	public void paintComponent(Graphics g)
	{
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
    }

"this.getWidth()" informuje, że szerokość obszaru ma być szerokości panelu. Ale nie rozumiem co znaczy w tym przypadku "this" jest to odwołanie do obiektu danej klasy. Przecież w danej klasie mogę mieć więcej funkcjonalności niż panel (JPanel) z którego jest pobierana szerokość. Skąd JVM wie, że chodzi mi konkretnie o szerokość panelu z tej klasy kiedy użyłem słówka this?

komentarz 29 grudnia 2017 przez mbabane Szeryf (79,280 p.)

 przekazuje on referencję do samego siebie

Tak.

 

"this.getWidth()" informuje, że szerokość obszaru ma być szerokości panelu. 

Wszystko zależy co to jest ten this bo np:

class JaksKlasa
{
    private int width;
    private int height;

    public int getWidth()
    {
        return width;
    }

    public int getHeight()
    {
        return height;
    }

    public void paintComponent(Graphics g)
    {
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
    }
}

I co teraz?

Z tego wszystkiego może wynikać, że każda instancja klasy posiada referencje do samej siebie, dzięki temu działa to this

 

Skąd JVM wie, że chodzi mi konkretnie o szerokość panelu z tej klasy kiedy użyłem słówka this

Niestety na to pytanie nie jestem w stanie odpowiedzieć, nie znam na tyle specyfikacji samej JVM. Mogę tylko domniemywać, że każdy obiekt posiada referencje do samego siebie i korzysta się z tego poprzez this

komentarz 1 stycznia 2018 przez rubesom Obywatel (1,690 p.)

Tutaj mam cały kod mojej klasy:
 

public class GUI1 extends JPanel implements ActionListener
{
    public void paintComponent(Graphics g)
    {
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        int czerwony = (int) (Math.random() * 256);
        int zielony = (int) (Math.random() * 256);
        int niebieski = (int) (Math.random() * 256);
 
        Color kolorLosowy = new Color(czerwony, zielony, niebieski);
        g.setColor(kolorLosowy);
        g.fillOval(70, 70, 100, 100);
//      Image obrazek = new ImageIcon("test2.png").getImage();
//      g.drawImage(obrazek, 5, 5, this);
    }
 
    public static void main(String[] args) 
    {
 
        GUI1 gui1 = new GUI1();
        JFrame ramka = new JFrame();
//      JButton przycisk = new JButton("klik");
 
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
//      ramka.getContentPane().add(przycisk);
 
        ramka.setSize(300, 300);
        ramka.setVisible(true);
        ramka.repaint();
        ramka.add(gui1);
 
    }
    @Override
    public void actionPerformed(ActionEvent e) 
    {
 
    }
 
}

Tutaj GUI1 dziedziczy po JPanel, który z kolei dziedziczy po JComponent w którym to jest metoda getWidth.

Czyli GUI1 mam metodę getWidth() ale jak to się dzieje, że this.getHeight()  ma w jakiś sposób dostęp do ramka.setSize(300, 300)?

setSize() używa jakoś getHeight()? Czy chodzi o coś jeszcze innego?

komentarz 1 stycznia 2018 przez mbabane Szeryf (79,280 p.)

JPanel jest wrzucany do JFrame, który ma nadany jakiś rozmiar (300 na 300 w tym przypadku). JPanel, rozciąga się automatycznie do JFrama, ponieważ ten zdaje się, że ma domyślnie ustawiony Layout na BorderLayout: 
https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

A że te komponenty jakiś rozmiar muszą mieć, to są ustawiane takie na jakie pozwala ten Layout. 

A maksymalnie uogólniając to przecież obiekt JPanela przekazujesz JFrame'owi poprzez metodę add. W tym momencie obiekt JFrame może skorzystać z metody np. setSize obiektu JPanel.
Poniżej mega abstrakcyjny przykład, który nie ma nic wspólnego z rzeczywistością:

class JFrame
{
     public void add(JComponent comp)
    {
             comp.setSize(300, 300); //nie ma problemu zeby cos takiego wywolać, zmienna comp to pelnoprwany obiekt, na ktorym mozna wywolac dowolna metode publiczna
     }
}

JFrame ramka = new JFrame();
JPanel jPanel = new JPanel();

ramka.add(jPanel);

 

komentarz 1 stycznia 2018 przez rubesom Obywatel (1,690 p.)
Czyli dodanie obiektu klasy GUI1 do JFrame jest równoznaczne z utworzeniem obiektu JPanel, przez to, że klasa dziedziczy po JPanel?

Twój przykład zrozumiałem ale w moim nie ma nigdzie jawnego stworzenia obiektu typu JPanel i dodania go do JFrame.
komentarz 1 stycznia 2018 przez mbabane Szeryf (79,280 p.)
edycja 1 stycznia 2018 przez mbabane

a metoda main?

Twoja klasa Gui1 rozszerza JPanel, zatem jest również pełnoprawnym JPanel'em (rzeczywiście nie jest to jawne wywołanie new JPanel(), ale ono tam jest).

Przepraszam bo skupilem się tylko na drugiej części Twojego pytania.

Czyli dodanie obiektu klasy GUI1 do JFrame jest równoznaczne z utworzeniem obiektu JPanel, przez to, że klasa dziedziczy po JPanel?

Dobrze kombinujesz. Tylko, nie dodanie obiektu klasy GUI1 jest równoznaczne z utworzeniem obiektu JPanel (dodanie to jest odrębna operacja), a utworzenie obiektu klasy GUI1 w metodzie main. Ponieważ... (drugi akapit tej wypowiedzi).

Poczytaj o dziedziczeniu w Javie, a wszystko Ci się wyklaruje, że tak powiem, samo.

komentarz 3 stycznia 2018 przez rubesom Obywatel (1,690 p.)
Rozumiem, że przy dziedziczeniu klasa GUI1 dziedziczy metody klasy JPanel ale nie wiedziałem, że mogę w ten sposób zrobić coś na wzór JPanel. Gdzie obiekt klasy (GUI1) dziedziczącej po JPanel, kiedy dodam go do JFrame to przejmie funkcjonalność JPanelu?
komentarz 3 stycznia 2018 przez mbabane Szeryf (79,280 p.)
edycja 3 stycznia 2018 przez mbabane
Nie wiem czy dobrze zrozumiałem. GUI1 funkcjonalność JPanel'u przejmuje już w momencie dziedziczenia (GUI1 extends JPanel). A JFrame nic nie przejmuje, ma tylko po prostu nad nim pewną kontrole.

Jeśli wlejesz wodę (JPanel) do kubka (JFrame) to po pierwsze woda  dalej jest wodą, a kubek nie przejmuje funkcji wody (np. nie da się go wypić). Ale kubek w tym momencie ma pewną kontrolę nad wodą np. taką że "kształt" wody będzie taki jak wnętrze kubka.

Możesz także rozszerzyć wodę robiąc z niej np. herbatę (GUI1). Po wlaniu tej herbaty do kubka, kubek w taki sam sposób obsłuży tę herbatę co wcześniej wodę, ponieważ herbata nie przestaje być wodą. Kubek w taki sam sposób będzie obsługiwał wszystkie powiedzmy płyny (JComponent'y), ponieważ tak został zaprojektowany (zauważ że metoda add jako parametr oczekuje czegoś klasy JComponent).

Podobne pytania

0 głosów
2 odpowiedzi 638 wizyt
pytanie zadane 14 grudnia 2017 w Java przez rubesom Obywatel (1,690 p.)
0 głosów
0 odpowiedzi 488 wizyt
0 głosów
4 odpowiedzi 228 wizyt
pytanie zadane 22 kwietnia 2016 w Java przez KamilloPL Gaduła (3,470 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...