Java odwołanie się do funkcji z poprzedniej klasy.

0

Witam,

Mam takie dwa pytanka związane ze sobą:

  1. Czy taki kod jest poprawny, czy obciąża pamięć i powinienem to przeprojektować?:
    Tworze nowy obiekt z KlasaGlowna: MojaKlasa mk = new MojaKlasa(this) w "this" przekazuje odwołanie do obiektu typu KlasaGlowna z którego stworzyłem mk, później w MojaKlasa zapisuje obiekt "this" czyli instancje KlasaGlowna do zmiennej np. klasaGlowna i mogę teraz bez problemu wywołać funkcję z klasaGlowna np. klasaGlowna.zmienCos(); Wtedy funkcja nie musi być statyczna.

  2. Jaka jest poprawna metoda tworzenie interfejsów graficznych (Swing) - ten sam problem.

Potrzebuję przejść z interfejsu A do B, a później z B do C

Jak dotąd robiłem - robię klasy dziedziczące po JPanel (interfejsy) i z klasy głównej która dziedziczy po JFrame lub JFrame jest w niej tworzone robię nowy interfejs np: MojInterfejs mojInterfejs = new MojInterfejs(this) (dziedziczy on po JPanel) i dodaje go do mojego JFrame, gdy chce przejść z B do C, muszę się odwołać do metody z interfejsu głównego (dlatego przekazuje go do MojInterfejs(this)), usunąć poprzedni interfejs z JFrame i dodać nowy.

Z góry dzięki za odpowiedź.

0
lethal_jelly napisał(a):

Witam,

Mam takie dwa pytanka związane ze sobą:

  1. Czy taki kod jest poprawny, czy obciąża pamięć i powinienem to przeprojektować?:
    Tworze nowy obiekt z KlasaGlowna: MojaKlasa mk = new MojaKlasa(this) w "this" przekazuje odwołanie do obiektu typu KlasaGlowna z którego stworzyłem mk, później w MojaKlasa zapisuje obiekt "this" czyli instancje KlasaGlowna do zmiennej np. klasaGlowna i mogę teraz bez problemu wywołać funkcję z klasaGlowna np. klasaGlowna.zmienCos(); Wtedy funkcja nie musi być statyczna.
    [...]

Ciężko powiedzieć, czy to rozwiązanie obciąża pamięć nie widząc kodu. Jeżeli w konstruktorze klasy MojaKlasa tworzysz nowy obiekt, to rzeczywiście możesz niepotrzebnie obciążać pamięć.
Najlepiej stwórz sobie interfejs z potrzebnymi metodami (np. wspomniane przykładowe zmienCos()). Następnie niech KlasaGlowna implementuje ten interfejs i jako typ parametru w konstruktorze klasy MojaKlasa podaj interfejs do którego będziesz mógł "wpiąć" klasę główną. Wtedy będziesz się odwoływał do stworzonej wcześniej instancji klasy i nie będziesz tworzył niepotrzebnych obiektów. Możliwe, że tak już zrobiłeś, ale tego nie wiem, bo nie widziałem kodu. ;-)

0

To jest przykładowy kod. Z Menu moge przejść do LosujDane, WczytajPlik lub do WprowadzDane a z nich mogę przejść do WyswietlWynik.
Najłatwiej by było umieścić wszystko w jednej klasie wtedy nie miałbym tego problemy ale kod byłby mniej czytelny.

 

public class Menu {

    JFrame frame;
    JPanel panel, wprowadzDane, losujDane, wczytajPlik;
    int stanProgramu = 0;

public Menu() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(0, 0, 640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        panel = new JPanel();
        panel.setBounds(0, 0, 624, 441);
        frame.getContentPane().add(panel);
        panel.setLayout(null);
        
        //Przycisk WprowadźDane
        JButton btnWprowadDane = new JButton("Wprowad\u017A dane");
        btnWprowadDane.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                wprowadzDane(); 
            }
        });
        btnWprowadDane.setBounds(238, 174, 130, 23);
        panel.add(btnWprowadDane);
        
        //Przycisk LosujDane
        JButton btnLosujDane = new JButton("Losuj dane");
        btnLosujDane.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                losujDane();
            }
        });
        btnLosujDane.setBounds(238, 208, 130, 23);
        panel.add(btnLosujDane);
        
        //Przycisk Czytajzpliku
        JButton btnNewButton = new JButton("Czytaj z pliku");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                czytajZPliku();
            }
        });
        btnNewButton.setBounds(238, 242, 130, 23);
        panel.add(btnNewButton);
        
        //Tekst z tytułem
        JLabel lblAlgorytmJohnsonaDla = new JLabel("Algorytm Johnsona dla trzech maszyn");
        lblAlgorytmJohnsonaDla.setBounds(157, 98, 308, 20);
        panel.add(lblAlgorytmJohnsonaDla);
        lblAlgorytmJohnsonaDla.setFont(new Font("Tahoma", Font.BOLD, 16));
        
    }
    
    void wprowadzDane() {
        wprowadzDane = new WprowadzDane(this);
        frame.remove(panel);
        frame.getContentPane().add(wprowadzDane);
        frame.revalidate();
        frame.repaint();
        stanProgramu = 2;
    }
    
//Tutaj jest kawałek kodu który opisałem
    void losujDane() {
        losujDane = new LosujDane(this);
        frame.remove(panel);
        frame.getContentPane().add(losujDane);
        frame.revalidate();
        frame.repaint();
        stanProgramu = 3;
    }
//....................................................

    void czytajZPliku() {
        wczytajPlik = new WczytajPlik(this);
        frame.remove(panel);
        frame.getContentPane().add(wczytajPlik);
        frame.revalidate();
        frame.repaint();
        stanProgramu = 4;
    }
    
    void wyswietlWynik(Zadanie[] maszynaPierwsza, Zadanie[] maszynaDruga, Zadanie[] maszynaTrzecia, int ileZadan) {
        JPanel wyswietlWynik = new WyswietlWynik(this, maszynaPierwsza, maszynaDruga, maszynaTrzecia, ileZadan);
        switch(stanProgramu) {
        case 2: frame.remove(wprowadzDane); break;
        case 3: frame.remove(losujDane); break;
        case 4: frame.remove(wczytajPlik); break;
        }
        frame.getContentPane().add(wyswietlWynik);
        frame.revalidate();
        frame.repaint();
    }
}
 
public class LosujDane extends JPanel {
    private static final long serialVersionUID = -5236301615653139342L;
    JComboBox<Integer> comboBox;
    Zadanie[] maszynaPierwsza;
    Zadanie[] maszynaDruga;
    Zadanie[] maszynaTrzecia;
    JLabel label, label_2, label_4;
    String dane1 = "", dane2 = "", dane3 = "";
    Random generator = new Random();
    Menu menu;
    int ileZadan;

    /**
     * Stworzenie JPanelu
     */
    public LosujDane(Menu m) {
        menu = m;
        setAutoscrolls(true);
        setBounds(new Rectangle(0, 0, 624, 441));
        setLayout(null);
        
        //Tekst Losuj dane:
        JLabel lblNewLabel = new JLabel("Losuj dane:");
        lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 16));
        lblNewLabel.setBounds(192, 35, 166, 20);
        add(lblNewLabel);
        
        //Pole wyboru ilości zadań
        Integer[] iloscZadan = {2,3,4,5,6,7,8,9,10,15,20};
        comboBox = new JComboBox<Integer>();
        comboBox.setModel(new DefaultComboBoxModel<Integer>(iloscZadan));
        comboBox.setBounds(118, 73, 42, 20);
        add(comboBox);
        
        //Tekst Ilość zadań
        JLabel lblNewLabel_1 = new JLabel("Ilo\u015B\u0107 zada\u0144:");
        lblNewLabel_1.setBounds(43, 76, 108, 14);
        add(lblNewLabel_1);
        
        //Przycisk generuj:
        JButton btnGeneruj = new JButton("Generuj");
        btnGeneruj.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                generuj();
            }
        });
        btnGeneruj.setBounds(53, 104, 89, 23);
        add(btnGeneruj);
        
        //Tekst Wylosowane dane dla pierwszej maszyny
        JLabel lblWylosowaneDaneDla = new JLabel("Wylosowane dane dla pierwszej maszyny:");
        lblWylosowaneDaneDla.setBounds(43, 163, 502, 14);
        add(lblWylosowaneDaneDla);
        
        label = new JLabel("");
        label.setBounds(43, 188, 502, 14);
        add(label);
        
        //Tekst Wylosowane dane dla drugiej maszyny
        JLabel lblWylosowaneDaneDla_1 = new JLabel("Wylosowane dane dla drugiej maszyny:");
        lblWylosowaneDaneDla_1.setBounds(43, 213, 502, 14);
        add(lblWylosowaneDaneDla_1);
        
        label_2 = new JLabel("");
        label_2.setBounds(43, 238, 502, 14);
        add(label_2);
        
        //Tekst Wylosowane dane dla trzeciej maszyny
        JLabel lblWylosowaneDaneDla_2 = new JLabel("Wylosowane dane dla trzeciej maszyny:");
        lblWylosowaneDaneDla_2.setBounds(43, 263, 502, 14);
        add(lblWylosowaneDaneDla_2);
        
        label_4 = new JLabel("");
        label_4.setBounds(43, 288, 502, 14);
        add(label_4);
        
        //Przycisk Zatwierdź
        JButton btnZatwierd = new JButton("Zatwierd\u017A");
        btnZatwierd.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                zatwierdz();
            }
        });
        btnZatwierd.setBounds(43, 339, 108, 23);
        add(btnZatwierd);

    }
    
    //Funkcja generująca losowe dane
    void generuj() {
        ileZadan = (Integer)comboBox.getSelectedItem();
        
        maszynaPierwsza = new Zadanie[ileZadan+1];
        maszynaDruga = new Zadanie[ileZadan+1];
        maszynaTrzecia = new Zadanie[ileZadan+1];
        
        for(int i = 1; i<=ileZadan; i++) {
            maszynaPierwsza[i]=new Zadanie(i,generator.nextInt(5)+1);
        }
        for(int i = 1; i<=ileZadan; i++) {
            maszynaTrzecia[i]=new Zadanie(i,generator.nextInt(5)+1);
        }
        //sprawdzamy warunek żeby czasy na drugiej maszynie nie były zdominowane
        //t2<=t1 lub t2<=t3
        for(int i = 1; i<=ileZadan; i++) {
            int l;
            if(maszynaPierwsza[i].wartosc>=maszynaTrzecia[i].wartosc) {
                l = generator.nextInt(maszynaPierwsza[i].wartosc)+1;
            }
            else {
                l = generator.nextInt(maszynaTrzecia[i].wartosc)+1;
            }
            maszynaDruga[i]=new Zadanie(i,l);
        }
        
        //Wyświetlenie wygenerowanych wartości w odpowiednich polach
        dane1 = "";
        dane2 = "";
        dane3 = "";
        for(int i = 1; i<=ileZadan; i++) {
            dane1 = dane1+maszynaPierwsza[i].wartosc+";";
        }
        label.setText(dane1);
        
        for(int i = 1; i<=ileZadan; i++) {
            dane2 = dane2+maszynaDruga[i].wartosc+";";
        }
        label_2.setText(dane2);
        
        for(int i = 1; i<=ileZadan; i++) {
            dane3 = dane3+maszynaTrzecia[i].wartosc+";";
        }
        label_4.setText(dane3);
    }
    
    //Tutaj jest odwołanie do poprzedniej funkcji
    void zatwierdz() {
        menu.wyswietlWynik(maszynaPierwsza, maszynaDruga, maszynaTrzecia, ileZadan);
    }

}

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