Podstawy klass

0
public class Pierwsza {
    public static void main(String[] args) {
        new Druga().okno();
    }
}
import javax.swing.*;

public class Druga extends JFrame {

    private JButton button=new JButton("cos");

    public JButton getButton() {
        return button;
    }
    public void okno(){
        JPanel panel=new JPanel();
        panel.add(button);
        getContentPane().add(panel);
        new Trzecia().zmien(getButton());
        setVisible(true);
        pack();
        setSize(300,200);
    }
}
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Trzecia  {

public void zmien(JButton button)
{
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            button.setText("zmieniam na cos innego");
        }
    });
}
}

Tak wszystko działa. Teraz chce utworzyć 4 klasę i zrobić to w taki sposób.

public class Czwarta {
    public void zmienn2()
    {
        Trzecia trzecia=new Trzecia();
        Druga druga=new Druga();
        trzecia.zmien(druga.getButton());
    }
}

I w drugiej zamiast tej linii "new Trzecia().zmien(getButton());" daj ta "new Czwarta().zmienn2();" i nie działa. To takie próby na mniejszym programie, ponieważ w wiekszym mam taki sam problem. Tak jakbym nie dostawał referencji do tego obiektu.

1

i nie działa

Co konkretnie nie działa?
Zresztą w tym kodzie w ogóle nic nie jest napisane z głową. Nie odróżniasz KLAS od OBIEKTÓW i to co robisz zupełnie nie ma sensu. Klasa to jest TYP, jak np. Krzesło. Obiekt to jest konkretny byt danego typu, np. krzesło na którym teraz siedzisz przy biurki jest obiektem.
W programie operuje sie zasadniczo obiektami, które jakoś współdziałają. new Cośtam() tworzy NOWY obiekt! W rzeczywistości zwykle jednak chcesz tych obiektów utworzyć tylko kilka a potem powiązać ze sobą. To co robisz wygląda mniej więcej tak, jakbyś kupował nowe krzesło za każdym razem kiedy chcesz je przesunąć, bo zamiast przesuwać krzesło które masz to robisz new Krzesło().przesuń().
Te twoje klasy nie mają z klasami nic wspólnego, bo nijak nie definiują typu.

Tak jakbym nie dostawał referencji do tego obiektu.

NIGDZIE nie przekazujesz referencji do istniejących obiektów, tylko tworzysz nowe.

0

Może się zle wyraziłem. To jest tylko program pokazujący gdzie mam problem. Nie wkleję tutaj głównego programu gdzie mam 9 klas i 800 linii kodu. Wracając do mojego problemu albo nie zrozumienia podstaw javy. Klasa pierwsza tworzy obiekt drugiej. Druga tak jak widać tworzy interfejs i w metodzie okno tworzy obiekt trzeciej klasy i wywołuje metodę zmień. I wszystko działa . Czyli napis w JButton zmienia się.
Ale chcę to uzyskać w inny sposób. Początek taki sam. Tworze klasę czwarta i w niej wywołuję metodę z trzeciej. A w drugiej zamiast trzeciej klasy jest wywoływana czwarta. I w taki sposób to nie działa.

0

Druga tak jak widać tworzy interfejs

Bzdura.

i wywołuje metodę zmień. I wszystko działa . Czyli napis w JButton zmienia się.

Ale to co robisz nadal jest bez sensu. Upakowałeś FUNKCJE w klasy, które de facto są tutaj co najwyżej jakimiś namespacami, a na dobrą sprawę mogłoby ich w ogóle nie być. Mógłbyś wpakować te wszystkie funkcje do jednego worka i nic by to nie zmieniło.

Tworze klasę czwarta i w niej wywołuję metodę z trzeciej. A w drugiej zamiast trzeciej klasy jest wywoływana czwarta.

Tak jak pisałem wyżej, nie rozumiesz czym różni sie OBIEKT od KLASY. Twoja "klasa" Czwarta tworzy NOWY OBIEKT "klasy" druga, który ma NOWY BUTTON i definiuje ZUPEŁNIE NOWE okienko. W efekcie oczywistym jest że napis na buttonie w starym okienku się nie zmienia bo TO SĄ DWA RÓŻNE OKIENKA!
Zrób:

public class Czwarta {
    public void zmienn2()
    {
        Trzecia trzecia=new Trzecia();
        Druga druga=new Druga();
        trzecia.zmien(druga.getButton());
        druga.okno(); // TUTAJ
    }
}

I zobacz co się stanie. Drugie okienko które utworzyłeś (robiąc new Druga()) pojawi sie na ekranie bo ustawiasz go na visible dopiero przy wołaniu okno().

Mam wrażenie że ktoś ci kazał napisać program "z użyciem klas" i próbujesz proceduralny kod jakoś w te klasy upakować, a tak sie zwyczajnie nie da i nie ma to sensu.

Nie wkleję tutaj głównego programu gdzie mam 9 klas i 800 linii kodu.

Jeśli napisałeś go tak jak te przykłady u góry to obawiam się że będzie trzeba to wszystko skasować i napisać od nowa.

0

Zdaje sobie sprawę że mój kod ma wiele błędów a możliwe że będę go na koniec musiał napisać jeszcze raz.I proszę nie zwracać uwagi na Angielsko/Polskie nazwy, zmieniam je powoli na ang. Ale chciałem jak najwięcej zrobić sam a później dać komuś to przejrzenia. Jeśli ktoś ma czas to proszę o to mój program
http://gist.github.com/pawel8903/a0506a71f35462bb7b54cdbefe6fde6b
Jak widać u góry w tłumaczeniu raczej nie jestem najlepszy ale spróbuje wyjaśnić co w tym momencie chcę zrobić i z czym ma problem.
Chcę aby tablice odświeżały się ponownie po dodaniu lub usunięciu klienta lub samochodu. W klasie MakeTable jest metoda refresh. Wcześniej zrobiłem to na zasadzie Listenera. Jak naciśnie się na button to się tablice usuwały i pobierał nowe. Ale ten sposób mnie nie pasował bo to użytkownik musiał nacisnąć na button aby się odświeżyły.
Usunąłem listenera i w 4 klasach (DodajKlienta, DodajSamochod,UsunKlienta,UsunSamochod) utworzyłem obiekt klasy MakeTable i wywołałem metodę refresh ale to nie działa i nie mam pomysłu jak to rozwiązać.
Myślałem że na prostszym przykładzie będzie łatwiej wytłumaczyć . Forum było zawsze ostatecznym rozwiązaniem problemu ale już mi brak pomysłów gdzie szukać. Dziękuje za pomoc i przepraszam za problem.

0

utworzyłem obiekt klasy MakeTable

No i to jest to o czym mówiłem! Utworzyłeś ZUPEŁNIE NOWY OBIEKT! A ty chcesz zmienić stan ISTNIEJĄCEGO OBIEKTU. Wyobraź sobie że chcesz zmienic dzwonek w swoim telefonie. Czy weźmiesz do ręki telefon i zmienisz dzwonek czy pójdziesz kupić nowy telefon? o_O Bo to teraz zrobiłeś. Kupiłeś nowy telefon, ustawiłeś tam dzwonek, a teraz patrzysz na swój stary telefon i narzekasz że cały czas ma stary dzwonek, mimo ze przecież "zmieniałeś dzwonek".

Do klasy UsunSamochod (i innych) dodaj pole typu MakeTable i przekazuj tam obiekt tejże klasy przez konstruktor i potem wywołuj akcje na tym obiekcie, a nie na nowym obiecie. Ale generalnie widzę że cały ten kod nadaje sie do kosza, bo wszędzie tam robisz new zamiast używać istniejacych obiektów.

Jak masz w programie jedno okienko to raz jedyny wołasz new na klasie okienka i KONIEC. Jak ci jest gdzieś potrzebny dostęp do tego okienka to masz sobie przekazać do niego referencje w argumentach metody, w konstruktorze obiektu albo w jakiś inny sposób, ale ABSOLUTNIE nie masz kolejny raz wołać new, bo utworzysz DRUGIE okienko.

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