Prosta aplikacja dla biblioteki

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?

1

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

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?

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.
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?

0

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

0

Może mapa jako zmienna statyczna?

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).

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?

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.

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.

0

Możesz wkleić cały kod, bo coś nie mogę się odnaleźć w tych kawałkach.

0

GlowneMenuOkienko

public class GlowneMenuOkienko extends javax.swing.JFrame {

    /**
     * Creates new form GlowneMenuOkienko
     */

    
    Biblioteka usluga;

    public GlowneMenuOkienko(Biblioteka usluga) {
        initComponents();
        this.usluga = usluga;
    }
    
        private static void StartAplikacji() {
            Biblioteka usluga = new Biblioteka();
            new GlowneMenuOkienko(usluga).setVisible(true);
    }
    
            
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        dodajKsiazke = new javax.swing.JButton();
        pobierzKsiazke = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        dodajKsiazke.setText("Dodaj książkę");
        dodajKsiazke.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                dodajKsiazkeMouseClicked(evt);
            }
        });

        pobierzKsiazke.setText("Pobierz książkę");
        pobierzKsiazke.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                pobierzKsiazkeMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(147, 147, 147)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(pobierzKsiazke)
                    .addComponent(dodajKsiazke))
                .addContainerGap(148, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(dodajKsiazke)
                .addGap(18, 18, 18)
                .addComponent(pobierzKsiazke)
                .addContainerGap(202, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

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

    private void pobierzKsiazkeMouseClicked(java.awt.event.MouseEvent evt) {                                            
        PobierzKsiazkeOkienko pobierzKsiazke = new PobierzKsiazkeOkienko();
        pobierzKsiazke.setVisible(true);
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                StartAplikacji();
            }
        });
        

    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton dodajKsiazke;
    private javax.swing.JButton pobierzKsiazke;
    // End of variables declaration                   
}

DodajKsiazkeOkienko

    private Biblioteka usluga;
    public DodajKsiazkeOkienko() {
        initComponents();
    }

    


    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jDesktopPane1 = new javax.swing.JDesktopPane();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        tfTytul = new javax.swing.JTextField();
        tfAutor = new javax.swing.JTextField();
        tfOpis = new javax.swing.JTextField();
        dodaj = new javax.swing.JButton();
        jLabel4 = new javax.swing.JLabel();
        tfIDKsiazki = new javax.swing.JTextField();

        jButton1.setText("jButton1");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jDesktopPane1Layout = new javax.swing.GroupLayout(jDesktopPane1);
        jDesktopPane1.setLayout(jDesktopPane1Layout);
        jDesktopPane1Layout.setHorizontalGroup(
            jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jDesktopPane1Layout.setVerticalGroup(
            jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Tytuł");

        jLabel2.setText("Autor");

        jLabel3.setText("Opis");

        dodaj.setText("Dodaj książkę");
        dodaj.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                dodajMouseClicked(evt);
            }
        });

        jLabel4.setText("ID Książki");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(38, 38, 38)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(jLabel3)
                            .addComponent(jLabel1)
                            .addComponent(jLabel4))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(tfTytul)
                            .addComponent(tfAutor)
                            .addComponent(tfOpis, javax.swing.GroupLayout.DEFAULT_SIZE, 252, Short.MAX_VALUE)
                            .addComponent(tfIDKsiazki)))
                    .addComponent(dodaj))
                .addContainerGap(47, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(17, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(tfIDKsiazki, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tfTytul, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(tfAutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(tfOpis, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addComponent(dodaj)
                .addGap(60, 60, 60))
        );

        pack();
    }// </editor-fold>                        

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

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

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


        JOptionPane.showMessageDialog(null, "Dodano książkę!");
        //System.out.println(usluga.ksiazki.keySet());
            this.dispose();
       
        
    }                                  

    /**
     * @param args the command line arguments
     */

    
    
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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(DodajKsiazkeOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(DodajKsiazkeOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(DodajKsiazkeOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(DodajKsiazkeOkienko.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                
                new DodajKsiazkeOkienko().setVisible(true);
            }
        });
        
        
        
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton dodaj;
    private javax.swing.JButton jButton1;
    private javax.swing.JDesktopPane jDesktopPane1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JTextField tfAutor;
    private javax.swing.JTextField tfIDKsiazki;
    private javax.swing.JTextField tfOpis;
    private javax.swing.JTextField tfTytul;
    // End of variables declaration                   
}

Biblioteka

public class Biblioteka{

   Map<String, Ksiazka> ksiazki;

    public Biblioteka() {
        this.ksiazki = new HashMap<>();
    }

    public void setKsiazki(Map<String, Ksiazka> ksiazki) {
        this.ksiazki = ksiazki;
    }


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

        Ksiazka nowaKsiazka = new Ksiazka(idKsiazki, tytul, autor, opis);
        this.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!");
    
    }
}

Jest jeszcze klasa Ksiazka a w niej jest tylko odpowiedni konstruktor oraz gettery i settery.

1

Jesteś pewna, że błąd mówi tylko o statyczności? Na szybko rzuciłem okiem i pierwsze co mi wpadło to:

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

inicjalizujesz obiekt używając konstruktor jednoargumentowy, gdzie w klasie DodajKsiazkeOkienko nie masz konstruktora przyjmującego obiekt Biblioteka.

1

W klasie DodajKsiazkeOkienko nie potrzebujesz funkcji main chyba, że planujesz ją uruchamiać osobno, bez głównego okna. W takim przypadku ktoś musi utworzyć obiekt Biblioteka.

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Biblioteka usluga = new Biblioteka();
                new DodajKsiazkeOkienko(usluga).setVisible(true);
                // Pojawi okno DodajKsiążkę, ale nie będzie okna głównego.
            }
        });
0

Tak, błąd dotyczył tylko statyczności ponieważ konstruktor utworzyłam ale potem zmieniałam w kodzie i o nim zapomniałam.
Faktycznie metoda main nie jest potrzebna ponieważ okienko otwiera się poprzez inną metodę. W netBeans tworzą się te metody automatycznie i nie zwróciłam na to uwagi. To rozwiązuje mój problem. Temat można zamknąć. Dziękuję wszystkim za pomoc oraz cierpliwe odpowiedzi na moje pytania :D

0

Dodam jeszcze jedno. Jak już się bawisz w tworzenie aplikacji, poczytaj o dodawaniu baz danych do aplikacji. Znajomość tego na pewno CI się przyda. Dzięki czemu zamiast przechowywać stworzone książki w mapie, będziesz mogła je pobierać z / zapisywać do bazy danych. Zapewnia Ci to nie zerowanie twoich książek po restarcie apki.

0

Czytałam co nieco o tym, ale na razie chcę stworzyć prostą aplikację. W późniejszym czasie jak będę ją rozwijać to na pewno wykorzystam bazę danych.

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