Niechciany "reset" zmiennej w innej klasie

0

Witam!

Mam sobie klasę NewGame, w ktoręj po nacisnięciu przycisku ustawiam nazwę firmy w klasie CompanyStats, interesujący nas fragment klasy NewGame wygląda tak:

JButton btnStart = new JButton("Zacznij gr\u0119");
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GameScreen gameScreen = new GameScreen();
                companyStats.setCompanyName(textNazwaFirmy.getText().trim());
                System.out.println(companyStats.getCompanyName());
                dispose();
            }
        });

print drukuje nam w konsoli wartość prawidłową (czyli odebraną z obiektu textNazwaFirmy).

Natomiast, problem pojawia sie w klasie GameScreen (do ktorej przechodzimy z NewGame) poniewaz nasza zmienna z CompanyStats "wróciła" do wartości domyślnej, tj "NIE PODANO NAZWY"

Kod klasy GameScreen:

public class GameScreen extends NoweOkno {
    public GameScreen() {
        
        CompanyStats companyStats = new CompanyStats();
        
        
        JLabel lblNewLabel = new JLabel(companyStats.getCompanyName());
        getContentPane().add(lblNewLabel, BorderLayout.NORTH);
    }

}

No i oczywiście klasa CompanyStats:

public class CompanyStats
{
    private static final String NIE_PODANO_NAZWY = "NIE PODANO NAZWY";
    private static final int NIE_PODANO_GOTOWKI = 0;
    
    
    
    private String companyName;
    private int companyMoney;
    
    public CompanyStats()
    {
        companyName=NIE_PODANO_NAZWY;
        companyMoney=NIE_PODANO_GOTOWKI;
    }    
    
    public void setCompanyName(String name)
    {
        companyName = name;
    }
    
    public String getCompanyName()
    {
        return(companyName);
    }
    
    public void setCompanyMoney(int money)
    {
        companyMoney = money;
    }
    
    public int getCompanyMoney()
    {
        return companyMoney;
    }
}

Czy konieczne jest zapisywanie niektórych zmiennych do pliku, w celu nie utracenia ich w trakcie dzialania aplikacji?

Czy może popełniam błąd w klasie GameScreen poprzez nieodpowiednie zainicjowanie obiektu companyStats (tj. zresetowanie zmiennych)?

0

W GameScreen tworzysz nowy obiekt, zatem zawiera on domyślne wartości. W NewGame operujesz na innej instancji klasy CompanyStats. Ustaw wartości a następnie przekaż obiekt CompanyStats w konstruktorze GameScreen.

2
  1. Najpierw wykonujesz konstruktor GameScreen(), który odczytuje wartość JLabel lblNewLabel = new JLabel(companyStats.getCompanyName()); więc do labelki ląduje domyślna wartość.
  2. Dopiero później ustawiasz nazwę companyStats.setCompanyName(textNazwaFirmy.getText().trim()); i wyświetlasz na system.out. Więc na konsolę leci prawidłowa wartość.
  3. W GameScreen tworzysz nową instancję CompanyStats companyStats = new CompanyStats(); co powoduje stworzenie obiektu z domyślnymi parametrami.

popraw:

public void actionPerformed(ActionEvent e) {
                companyStats.setCompanyName(textNazwaFirmy.getText().trim());
                GameScreen gameScreen = new GameScreen(companyStats);
                System.out.println(companyStats.getCompanyName());
                dispose();
            }

oraz konstruktor GameScreen:

  public GameScreen(CompanyStats companyStats) {
        JLabel lblNewLabel = new JLabel(companyStats.getCompanyName());
        getContentPane().add(lblNewLabel, BorderLayout.NORTH);
    }
0

Jak wyżej, ewentualnie poczytaj o Singleton'ach

0

Dzięki wszystkim za pomoc!

Nie tylko wyjaśniliści mi co robię źle, ale również dlaczego robię to źle, naprawdę dzięki :)

Pozdrawiam!

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