Dostęp do obiektów, utworzonych w klasie nadrzędnej, z klasy podrzędnej.

0

Pytanie jest zawarte w poniższym prostym kodzie (komentarze):
klasa T00:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class T00 {
    public static JPanel zm;                           //utworzenie publicznej zmiennej "referencyjnej"
    public static void main(String[] args){
        JFrame W = new JFrame();
        JPanel P = new JPanel();
        zm = P;                                                //przypisanie referencji obiektu do zmiennej
        W.getContentPane().add(P);
        
        JButton ColorButton1 = new JButton("orange");
        P.add(ColorButton1);
        ColorButton1.addActionListener(new ColorButton1ActionListener());
        
        JButton ColorButton2 = new JButton("green");
        P.add(ColorButton2);
        
        ColorButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                P.setBackground(Color.GREEN);   //tu odniesienie się dp obiektu P działa
                System.out.println("GREEN");
            }
        });
        
        W.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        W.setSize(320,240);
        W.setVisible(true);
    }
}

klasa ColorButton1ActionListener:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ColorButton1ActionListener extends T00 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        /*
         *poniżej działa tylko przez publiczną zmienną referencyjną z klasy "nadrzędnej". Czy da się inaczej? Czy to zgodne ze sztuką?
        */
        zm.setBackground(Color.ORANGE);
        System.out.println("ORANGE");
    }
}
0

Zmień public na protected.

0

Dzięki za zainteresowanie ale pytanie brzmi: czy możliwy jest dostęp do obiektu P, utworzonego w klasie nadrzędnej, z klasy poddrzędnej bez tworzenia zmiennej "zm"? Jesli tak, to w jaki sposób?

0

Jasne że można i to znacznie lepiej. Przekazuj po prostu do tego ActionListenera referencje do obiektu który jest mu potrzebny. Wywal tego statica póki nikt nie widział...

0

Nadawaj klasom sensowne nazwy, a metodę main wrzuć do jakiejś osobnej klasy o nazwie np. Initializer albo Application. Rozszerzając post @Shalom: unikaj tworzenia dziwnych hierarchii klas. Często po samych nazwach klas można poznać czy taka hierarchia ma sens (jeśli nie potrafisz sensownie nazwać klas to znak, że z twoim rozwiązaniem jest zdecydowanie coś nie tak).

0

Do Shalom:
"static" to nie mój pomysł tylko kompilatora (Eclipse) :)
A możesz napisać kod jak to zrobić lepiej? Zaczynam przygodę z javą...

0

Kompilator dał ci taki "pomysł", bo metoda main jest statyczna i nie może operować na instancji obiektu.

A możesz napisać kod jak to zrobić lepiej?

Już ci napisał jak zrobić to lepiej, ja też.

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