Prosta aplikacja dla biblioteki

Prosta aplikacja dla biblioteki
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
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?

K5
Wrzuć na pastebin swój kod
ZB
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:23
1

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

A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
0

klasa Ksiazka

Kopiuj
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

Kopiuj
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

Kopiuj
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

Kopiuj
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
K5
  • Rejestracja:około 6 lat
  • Ostatnio:około 22 godziny
  • Postów:1002
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.
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
0

Utworzyłam nową klasę

Kopiuj
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:

Kopiuj
    private BibliotekaRun run;

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

Kopiuj
 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
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów: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?

Belka
  • Rejestracja:prawie 8 lat
  • Ostatnio:2 dni
  • Lokalizacja:PL
  • Postów:452
0

Może mapa jako zmienna statyczna?

DA
  • Rejestracja:około 6 lat
  • Ostatnio:około 7 godzin
  • Postów:142
1

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

Kopiuj
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-
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
0
Kopiuj
public class BibliotekaRun {

            public static void main(String[] args) {

           Biblioteka usluga = new Biblioteka();     
        GlowneMenuOkienko menuOkienko = new GlowneMenuOkienko(usluga);
        menuOkienko.setVisible(true);
  
    }
}
Kopiuj
    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?

DA
  • Rejestracja:około 6 lat
  • Ostatnio:około 7 godzin
  • Postów:142
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.

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

Kopiuj
    private static void StartAplikacji() {
        Biblioteka usluga = new Biblioteka();
        new GlowneMenuOkienko(usluga).setVisible(true);
    }
Kopiuj
        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-
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
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.

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

DA
  • Rejestracja:około 6 lat
  • Ostatnio:około 7 godzin
  • Postów:142
0

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

A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
0

GlowneMenuOkienko

Kopiuj
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

Kopiuj
    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

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

K5
  • Rejestracja:około 6 lat
  • Ostatnio:około 22 godziny
  • Postów:1002
1

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

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

DA
  • Rejestracja:około 6 lat
  • Ostatnio:około 7 godzin
  • Postów:142
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.

Kopiuj
        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.
            }
        });
edytowany 1x, ostatnio: -daniel-
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
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

K5
  • Rejestracja:około 6 lat
  • Ostatnio:około 22 godziny
  • Postów:1002
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.

edytowany 1x, ostatnio: kixe52
A1
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:14
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)