Prosta aplikacja dla biblioteki

Odpowiedz Nowy wątek
2019-05-13 14:11
0

Witam, chciałam stworzyć prostą aplikację okienkowa dla biblioteki. Stworzyłam klasę książka, w której znajdują się następujące atrybuty: id, tytuł, autor, opis. Następnie utworzyłam klasę biblioteka, w której stworzyłam mapę <String, Ksiazka>, założyłam że id jest Stringiem, oraz ustawiłam je jako wartość dla klucza. Utworzyłam też w tej klasie metody do dodawania książki i wyświetlania książki. Utworzyłam też klasy dodajKsiazke oraz pobierzKsiazke w których znajduje się implementacja okienek. Dodawanie książek do mapy działa, niestety mam problem z ich pobraniem, ponieważ mimo iż wpisuję poprawne id wyskakuje mi, że nie ma książki z takim id. Czy powodem tego może być że w klasie dodajKsiążke i pobierzKsiazke odwołuję się do klasy Biblioteka, w której stworzona jest mapa? A jeśli nie to co może być powodem że nie widzi mi danych zapisanych w mapie?

Wrzuć na pastebin swój kod - kixe52 2019-05-13 14:13

Pozostało 580 znaków

2019-05-13 20:28
1

A możemy prosić o wrzucenie troche kodu, wtedy będzie łatwiej pomóc.

Pozostało 580 znaków

2019-05-13 20:58
0

klasa Ksiazka

public class Ksiazka {

    private String idKsiazki;
    private String tytul;
    private String autor;
    private String opis;

    public Ksiazka(String idKsiazki, String tytul, String autor, String opis) {
        this.idKsiazki = idKsiazki;
        this.tytul = tytul;
        this.autor = autor;
        this.opis = opis;

    }

    public String getIdKsiazki() {
        return idKsiazki;
    }

    public void setIdKsiazki(String idKsiazki) {
        this.idKsiazki = idKsiazki;
    }

    public String getTytul() {
        return tytul;
    }

    public void setTytul(String tytul) {
        this.tytul = tytul;
    }

    public String getAutor() {
        return autor;
    }

    public String getOpis() {
        return opis;
    }

    public void setOpis(String opis) {
        this.opis = opis;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }
}

klasa biblioteka

import java.util.HashMap;
import java.util.Map;

public class Biblioteka {

    Map<String, Ksiazka> ksiazki = new HashMap<>();

    public int dodajKsiazke(String idKsiazki, String tytul, String autor, String opis){

        Ksiazka nowaKsiazka = new Ksiazka(idKsiazki, tytul, autor, opis);
        ksiazki.put(idKsiazki, nowaKsiazka);
        return ksiazki.size();

    }

    public Ksiazka pobierzKsiazke(String idKsiazki) throws Exception{

        if(ksiazki.containsKey(idKsiazki))
        return ksiazki.get(idKsiazki);
        else throw new Exception("Nie ma takiej książki!");

    }
}

przycisk dodaj

private void dodajMouseClicked(java.awt.event.MouseEvent evt) {                                   

        String idKsiazki = tfIDKsiazki.getText();
        String tytul = tfTytul.getText();
        String autor = tfAutor.getText();
        String opis = tfOpis.getText();

        Biblioteka usluga = new Biblioteka();
        usluga.dodajKsiazke(idKsiazki, tytul, autor, opis);
        System.out.println(idKsiazki + tytul + autor + opis);
        JOptionPane.showMessageDialog(null, "Dodano książkę!");
        System.out.println(usluga.ksiazki.values());
            this.dispose();

    }

przycisk pobierz

private void dodajMouseClicked(java.awt.event.MouseEvent evt) {                                   

        String idKsiazki = tfIDKsiazki.getText();
        String tytul = tfTytul.getText();
        String autor = tfAutor.getText();
        String opis = tfOpis.getText();

        Biblioteka usluga = new Biblioteka();
        usluga.dodajKsiazke(idKsiazki, tytul, autor, opis);
        System.out.println(idKsiazki + tytul + autor + opis);
        JOptionPane.showMessageDialog(null, "Dodano książkę!");
            this.dispose();

    }

Do przycisków są 2 osobne klasy ale nie wstawiam ich całych ponieważ projekt jest w netBeans więc okienka tworzyłam w jFrame automatycznie i więcej kodu w nich nie pisałam.
Wykonując Biblioteka usluga = new Biblioteka(); dla obu przycisków tworzy mi się nowa mapa i nie zapisują mi się dodane nowe książki. Jak mam dostać się do tej mapy z różnych klas tak by nie tracić danych w niej zapisanych?

edytowany 1x, ostatnio: Alusair1, 2019-05-13 20:59

Pozostało 580 znaków

2019-05-13 21:04
0
  1. Wrzuciłes dwa razy tą samą metodę.
  2. Za każdym razem tworzy Ci się nowa mapa, bo tworzysz kilkukrotnie instancje klasy Biblioteka, a do niej właśnie jest przypisana twoja mapa.
    Zmień swój kod tak, aby w metodach odpalanych po naciśnięciu buttonu nie tworzyć za każdym razem instancji klasy biblioteka.
    Stwórz bibliotekę raz, po starcie programu, a następnie przekazuj ten obiekt do innych metod jako argument.

Pozostało 580 znaków

2019-05-13 21:41
0

Utworzyłam nową klasę

public class BibliotekaRun {
        public static void main(String[] args) {
        Biblioteka usluga = new Biblioteka(); 
        GlowneMenuOkienko menuOkienko = new GlowneMenuOkienko();
        menuOkienko.setVisible(true);

    }

}

tworze w niej instancje klasy Biblioteka i uruchamiam główne okienko.
Następnie w klasie z przyciskiem dodaj odwołałam się do tej klasy w taki sposób:

    private BibliotekaRun run;

a w metodzie obsługującej przycisk, żeby dostać się do metody dodajKsiazke zrobiłam tak:

 private void dodajMouseClicked(java.awt.event.MouseEvent evt) {                                   
        //BibliotekaUsluga usluga = new BibliotekaUsluga();

        String idK = tfIDKsiazki.getText();
        String tytul = tfTytul.getText();
        String autor = tfAutor.getText();
        String opis = tfOpis.getText();

        run.usluga.dodajKsiazke(idK, tytul, autor, opis);

        JOptionPane.showMessageDialog(null, "Dodano książkę!");

            this.dispose();

    }   

A po uruchomieniu programu, wpisaniu danych w pola tekstowe i naciśnięciu przycisku wyskakuje mi taki oto błąd:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Co robię źle? Jak inaczej mam się dostać do metody dodajKsiazke żeby nie tworzyć nowych instancji klasy?

edytowany 1x, ostatnio: Alusair1, 2019-05-14 20:33

Pozostało 580 znaków

2019-05-15 11:14
0

Jak mogę wielokrotnie odwoływać się do jednej mapy z różnych klas, nie tracąc danych, które do niej dodałam?

Pozostało 580 znaków

2019-05-15 11:32
0

Może mapa jako zmienna statyczna?

Pozostało 580 znaków

2019-05-15 12:50
1

Każdemu tworzonemu okienku/formie przekazuj bibliotekę jako parametr

Biblioteka usluga = new Biblioteka(); 
GlowneMenuOkienko menuOkienko = new GlowneMenuOkienko( biblioteka );

Każdy konstruktor może ją zapamiętywać w this.cośtam, gdzie będzie dostępna dla obsługi zdarzeń, albo używaj ją bezpośrednio przy definiowaniu handlerów zdarzeń (może być potrzebne final).

edytowany 1x, ostatnio: -daniel-, 2019-05-15 12:51

Pozostało 580 znaków

2019-05-15 19:35
0
public class BibliotekaRun {

            public static void main(String[] args) {

           Biblioteka usluga = new Biblioteka();     
        GlowneMenuOkienko menuOkienko = new GlowneMenuOkienko(usluga);
        menuOkienko.setVisible(true);

    }
}
    Biblioteka usluga;

    public GlowneMenuOkienko(Biblioteka usluga) {
        initComponents();
        this.usluga = usluga;
    }

public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(GlowneMenuOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(GlowneMenuOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(GlowneMenuOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(GlowneMenuOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GlowneMenuOkienko(usluga).setVisible(true);
            }
        });        
    }

Gdy chce przekazywać Bibliotekę jako parametr, tworze odpowiednie pole w konstruktorze ale w metodzie run gdy jako parametr podaje tak jak jest teraz usluga, to wyskakuje mi błąd że usluga jest nie statyczna. Co zrobić w takim przypadku?

Pozostało 580 znaków

2019-05-15 20:09
1

main jest funkcją statyczną, więc nie ma this i z niej nie można się dostać do niestatycznych zmiennych. obiekt Biblioteka może być utworzony tuż przed utworzeniem GlowneMenuOkienko tak , jak w mojej poprzedniej odpowiedzi.

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Biblioteka usluga = new Biblioteka();
                new GlowneMenuOkienko(usluga).setVisible(true);
            }
        });        

Osobiście wydzieliłbym ten kod do osobnej funkcji np. StartAplikacji dzięki czemu nie będzie trzeba grzebać w dość długiej funkcji main.

    private static void StartAplikacji() {
        Biblioteka usluga = new Biblioteka();
        new GlowneMenuOkienko(usluga).setVisible(true);
    }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                StartAplikacji();
            }
        });        

Jeśli GlowneMenuOkienko istnieje przez cały czas działania programu, to bibliotekę możesz też utworzyć w jego konstruktorze. Dalej bibliotekę przekazujesz ewentualnym innym oknom przez parametr.

A jeśli jako parametr miałaby być przekazywana BibliotekaRun, to trzeba utworzyć w main jej instancję przez new.

edytowany 1x, ostatnio: -daniel-, 2019-05-15 20:12

Pozostało 580 znaków

2019-05-15 20:51
0

Dodałam funkcję StartAplikacji do klasy GlowneMenuOkienko i gdy chcę w tej klasie przekazać Bibliotekę przez parametr to w klasie DodajKsiazkeOkienko muszę ją dodać do konstruktora ale znowu przy metodzie run wyskakuje błąd że nie jest statyczne.

    Biblioteka usluga;

    public GlowneMenuOkienko(Biblioteka usluga) {
        initComponents();
        this.usluga = usluga;
    }

        private static void StartAplikacji() {
            Biblioteka usluga = new Biblioteka();
            new GlowneMenuOkienko(usluga).setVisible(true);
    }

    private void dodajKsiazkeMouseClicked(java.awt.event.MouseEvent evt) {                                          
        DodajKsiazkeOkienko dodajKsiazke = new DodajKsiazkeOkienko(usluga);
        dodajKsiazke.setVisible(true);  
    } 

Tak wygląda kod w GlowneMenuOkienko i gdy usługa jest przekazana jako parametr w metodzie dodajKsiazkeMouseClicked to ciągle ten sam błąd się pojawia.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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