Hausarbeit(fertig) Fehlermeldung - komme nicht weiter

FlowerPower

Neues Mitglied
Hey Leute,
ich habe für meine Hausarbeit ein Code über ein Telefonbuch mit 5 Klassen erstellt.

In meinem Code habe ich keinerlei Fehlermeldungen. Wenn ich jedoch den Code starten möchte erscheint auf der Console diese Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 2
at java.desktop/java.awt.Container.getComponent(Container.java:354)
at java.desktop/javax.swing.JMenu.getMenuComponent(JMenu.java:871)
at hausarbeit_JAVA.TelefonbuchGUI.setMenusettings(TelefonbuchGUI.java:534)
at hausarbeit_JAVA.TelefonbuchGUI.erstelleGui(TelefonbuchGUI.java:221)
at hausarbeit_JAVA.TelefonbuchGUI.<init>(TelefonbuchGUI.java:93)
at hausarbeit_JAVA.TelefonbuchGUI.lambda$10(TelefonbuchGUI.java:557)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

ich habe keine Ahnung wo das Problem liegt. Auf meinem Mac lief der Code tadellos und diesen Code habe ich auf mein Windows Eclipse kopiert, liegt es eventuell daran?

Eine weitere Vermutung ist, dass etwas mit den Libraries nicht stimmt. Habe JavaSe-17 und JavaSe-1.8 drin.

Java:
1.Klasse

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import java.util.ArrayList;
import java.util.List;

 /*
 * Die Klasse TelefonbuchGUI kriegt die Klasse JFRAME vererbt.
 = Somit ist TelefonbuchGUI ein JFrame mit zusätzlichen Methoden
 * und Funktionen.
 »* In dieser Klasse werden alle Elemente für die GUI erstellt und
 * wiedergegeben (Benutzerebene)
*/

public class TelefonbuchGUI extends JFrame{
private static final long serialVersionUID = -7664429122669085214L;
 //Der. manager, damit die Daten geladen werden können
  private TelefonbuchManager manager;

  //Die Menu-Bar I
  private JMenuBar menuBar;

  //Namen. für Scenes
  private static final String KONT_SCREEN = "kontakt";
  private static final String TELB_SCREEN = "telefonbuch";

  /*
  * Die Panels
  * Auf dem mainPanel ist die nenu-Bar mi% dem Candoanal
  * — kontaktFormularPanel (Card -> KONT_SCREEN)
  * - telefonbuchPanel (Card -> TELB_SCREEN)
  */

  private JPanel mainPanel;
  private JPanel cardpanel;
  private JPanel welcomePanel;
  private JPanel kontaktFormularPanel;
  private JPanel telefonbuchPanel;

  //Die Kontakt-Scene
  private JTextField nameTextField;
  private JTextField adresseTextField;
  private JTextField emailTextField;
  private JTextField telefonnummerTextField;
  private JTextField typTextField;

  //Die Telefonbuch-Scene enthaltenen Elemente
  private JTable table;

  //Elemente zum zwischenspeichern
  private DefaultListModel<Telefonnummer> telefonnummerListModel;
  private JList<Telefonnummer> telefonnummerList;
  private int selectedrow = -1;
  private int aenderung = -1;

   /*
   * Der. Konst.ruktor für die TelefonbuchGUI-Klasse
   * Hier. werden alle wesentlichen Variablen für die Klasse erstellt,
   *die im Laufe des Programms verwendet werden.
   */
  public TelefonbuchGUI() {
      /*
       * Mit Super() kriegt man alle nötigen Variablen und Methoden aus der Superklasse JFrame vererbt.
       * Somit muss. ich nicht mit JFrame frame = new JFrame(...) arbeiten, sqNndern meine GUI wird
       * Zu JFrame + features
       */
      super();

      // Der. Managbr wird erstellt
       manager = new TelefonbuchManager();

      /* erstelle die einzelnen Panel
       — erstelle Gui -> Menu + cardpanel auf mainPanel
       * erstellewelcomePanel = welcomePanel
       * erstellekontaktPanel = KontaktPanel
       * erstelleTelefonbPanel = TelefonbuchPanel
       */

       erstelleGui();

       // frame.pack() =
       pack();
      
       // frame.setVisible(boolean) = Ist der Frame sichtbar
       setVisible(true);
  }
  /*
   * Menu + cardpanel auf mainPanel
   * -erstellewelcomePanel() = welcomePanel
   * -erstellekontaktPanel() = KontaktPanel
   * -erstelleTelefonbPanel() = TelefonbuchPanel
   */
  public void erstelleGui() {
    // Initialisiere mainPanel
     mainPanel = new JPanel(new FlowLayout());
    
      /*
      * Die Rahmenbedingungen für unseren main Frame
      * - frame.setPrefferedSize = Größe des Frames
      * - setDefaultCloseOperation = standard schließ-Funktion, wenn man auf das x drückt
      * - setTitle = Name des frames (was oben auf dem Fenster steht)
      */
      
     // frame.setprefferedSize = Größe des Frames
      setPreferredSize(new Dimension(700, 600));
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setTitle("Telefonbuch");
    
      /*------------------------------------” Menü-Bar ”--------------------------------------------------- */
                
      // erstelle unser. Menu, subMenu
      menuBar = new JMenuBar();
      JMenu telefonbuchMenu = new JMenu("Telefonbuch");
      JMenu kontaktMenu = new JMenu("Kontakt");
    
      /* -----------------------------------------Telefonbuch-----------------------------------------------*/
          
      // Telefonbuch -> Laden
      JMenuItem ladenMenuItem = new JMenuItem("Laden");
      // Telefonbuch ->
      JMenuItem speichernMenuItem = new JMenuItem("Speichern");
      // Telefonbuch ->
      JMenuItem beendenMenuItem = new JMenuItem("Beenden");
    


      // Listener für die jeweiligen Menü-Items
       ladenMenuItem.addActionListener(e -> {
           // Die Datei wird geladen
          manager.laden();
          // Der Frame ändert sich zu Telefonbuch und die Tabelle wird geladen
          tableload();

          // Die Menüs. werden auf die standard- Einstellung gesetzt
          setMenusettings();

          // die Menüs werden auf ich habe Kontakte gesetzt
          setMenusavesettings();
       });
      
       // Speicher die Liste von Kontakten
       speichernMenuItem.addActionListener(e -> manager.speichern());
       // Beende das Programm
       beendenMenuItem.addActionListener(e -> System.exit(0));
          
       /* -------------------------------------” Kontakt ”------------------------------ */
       // Kontakt -> Neuer Kontakt
       JMenuItem neuerKontaktMenuItem = new JMenuItem("Neuer Kontakt");
       // Kontakt -> Alle Kontakte anzeigen
       JMenuItem alleKontakteAnzeigenMenuItem = new JMenuItem("Alle Kontakte anzeigen");
       // Kontakt -> Kontakt Suchen
       JMenuItem kontaktSuchenMenuItem = new JMenuItem("Kontakt suchen");
       // Kontakt -> löschen
       JMenuItem kontaktLoeschenMenuItem = new JMenuItem("Kontakt löschen");
                  
        // Listener für die jeweiligen Menü-Items
        neuerKontaktMenuItem.addActionListener(e -> {
             // frame, changeScreen(Konakt) = Kontakt Formular wird num angezeigt
             changeScreen(KONT_SCREEN);
             // leere alle Inhalte (Blank Formular)
             resetKontaktFormular();
        });
        // Der Frame ändert sich zu Telefonbuch und die Tabelle wird
        alleKontakteAnzeigenMenuItem.addActionListener(e -> tableload());
        kontaktSuchenMenuItem.addActionListener(e -> {
               // Der Frame ändert sich zu Telefonbuch und die Tabelle wird oeladen
                     tableload();
               // Man muss einen Suchbegriff eingeben und dieser wird in dem String gespeichert
                     String suchbegriff = JOptionPane.showInputDialog("Suchbegriff eingeben:");
                  
               //System.out.printin(*+suchbegriff+"*and sizes "+suchbegriff. length());
            // Wenn der. Suchbegriff nicht. leer ist, dann
               if (suchbegriff.length() != 0){
                   // gebe mir die ID, wo der Kontakt gefunden werden kann, Kein Kontakt = -1
                   int id= manager. kontaktSuchen (suchbegriff);
                   //System.out.printin(id);
                   // Ist ein Kontakt gefunden (immer nur der erste Treffer)
                   if (id > -1){                                                                           
                   // setzte die markierte Zeile auf meine ID -> führt zum Laden des Kontakts
                   table.setRowSelectionInterval(id,id);
                   }
               }
        });
        
        kontaktLoeschenMenuItem.addActionListener(e -> {
            // Der. Frame ändert sich zu Telefonbuch und die Tabelle wird geladen
            tableload();
            // Man gibt einen Suchbegriff ein und dreser Kontakt wird geloscht
            manager.kontaktLoeschen();
            // Falls das Telefonbuch noch nicht bearbeitet wurde, stelle den Menüpunkt Telefonbuch -> Speichern auf true
            menuBar.getMenu(0).getMenuComponent(1).setEnabled(true);
            // Lade die Tabelle new, somit wird der gelöschte Kontakt nicht mehr. angezeigt
            tableload();
        });
                  
        // setze die Menüpunkte in die Menüs, in die Menübar telefonbuchMenu.add(ladenMenuItem);
        telefonbuchMenu.add(speichernMenuItem);
        telefonbuchMenu.add(beendenMenuItem);
        kontaktMenu.add(neuerKontaktMenuItem);
        kontaktMenu.add(alleKontakteAnzeigenMenuItem);
        kontaktMenu.add(kontaktSuchenMenuItem);
        kontaktMenu.add(kontaktLoeschenMenuItem);
        menuBar.add(telefonbuchMenu);
        menuBar.add(kontaktMenu);
                  
        // Die Menüs werden auf die standard- Einstellung gesetzt + Keine Kontakte enthalten
        setMenusettings();
        alleKontakteAnzeigenMenuItem.setEnabled(false);
        kontaktSuchenMenuItem.setEnabled(false);
        kontaktLoeschenMenuItem.setEnabled(false);
        // Unser Frame erhällt menuBar
        setJMenuBar(menuBar);

        /*----------------------------------------Cardlayout-------------------------------------------*/
              
        erstellewelcomePanel();
        erstellekontaktPanel();
        erstelleTelefonbPanel();
        
        /* erstelle das Cardlayout
        - JPanel Seite 0: Welcome Message
        - Jpanel Seite 1: KontaktFormular
        - Jpanel Seite 2: Telefonbuch
        */
        cardpanel = new JPanel(new CardLayout());
        cardpanel. add (welcomePanel, "0");
        cardpanel. add (kontaktFormularPanel, KONT_SCREEN);
        cardpanel. add (telefonbuchPanel, TELB_SCREEN);
        
        // setze unter dem Menu unser, CardPanel
        mainPanel.add (cardpanel);
        
        // frame. add(mainPanel) = unser. Frame erhallt das mainPanel
        add (mainPanel);
  }
      
    // Die Hauptseite wird erstellt
    public void erstellewelcomePanel(){
        //Grid Darstellung
        welcomePanel= new JPanel (new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        // Der gesammte Inhalt ist in der. Mitte
        c.insets = new Insets(5, 5,
        5, 5);
        // Die Begrüßungsnachricht
        JLabel welcomeLabel = new JLabel("<html><p align=\"center\">willkommen zu zum Telefonbuch-Manager <br» Hier können Sie Kontakte erstellen oder verwalte");
                welcomePanel. add (welcomeLabel,c);
    }
    
    // Kontakt erstellen und bearbeiten Formular.- Seite
    public void erstellekontaktPanel() {
        //Grid Darstellung
        kontaktFormularPanel= new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        // Der gesamte Inhalt ist in der Mitte
        c.insets = new Insets(5, 5, 5, 5);
        
        // Das Namensfeld
        JLabel nameLabel = new JLabel ("Name:");
        nameTextField = new JTextField(20);
        kontaktFormularPanel.add(nameLabel,c);
        c.gridx++;
        kontaktFormularPanel.add(nameTextField,c);
        
        c.gridx = 0;
        c.gridy++;
        
        // Das. Adressfeld
        JLabel adresseLabel = new JLabel("Adresse:");
        adresseTextField = new JTextField (20);
        kontaktFormularPanel.add(adresseLabel,c);
        c.gridx++;
        kontaktFormularPanel.add(adresseTextField,c);
        c.gridx = 0;
        c.gridy++;
        
        // Das E-Mail-Feld
        JLabel emailLabel = new JLabel("E-Mail:");
        emailTextField = new JTextField (20);
        kontaktFormularPanel.add(emailLabel,c);
        c.gridx++;
        kontaktFormularPanel.add(emailTextField,c);
        c.gridx = 0;
        c.gridy++;
        
        //Das Telefonnr.-Feld
        JLabel telefonnummerLabel = new JLabel("Telefonnummer:");
        telefonnummerTextField = new JTextField(20);
        kontaktFormularPanel.add(telefonnummerLabel,c);
        c.gridx++;
        kontaktFormularPanel.add(telefonnummerTextField,c);
        
        c.gridx = 0;
        c.gridy++;
        
        // Das Typ-Feld
        JLabel typLabel = new JLabel("Typ:");
        typTextField = new JTextField(20);
        kontaktFormularPanel.add(typLabel,c);
        c.gridx++;
        kontaktFormularPanel.add(typTextField,c);
        
        
        c.gridx = 0;
        c.gridy++;
        
        // die Telefonnr. Liste
        telefonnummerListModel = new DefaultListModel<>();
        telefonnummerList = new JList<>(telefonnummerListModel);
        telefonnummerList.setVisibleRowCount(5);
        JScrollPane telefonnummerScrollPane = new JScrollPane (telefonnummerList);
        
        // Button Telefonnummer hinzufügen
        JButton telefonnummerHinzufuegenButton = new JButton("Telefonnummer hinzufügen") ;
        telefonnummerHinzufuegenButton.addActionListener(e->{
            String telefonnummer = telefonnummerTextField.getText();
            String typ = typTextField.getText () ;
            //test imput
            if (typ. length()<1) typ= "NOTYPE";
            telefonnummerListModel.addElement(new Telefonnummer (telefonnummer, typ));
            telefonnummerTextField.setText("");
            typTextField.setText("");
            JOptionPane.showMessageDialog(null, "Die Nummer "+telefonnummer+" von Typ: "+typ+" wurde hinzugefügt!");                       
        });
                        
        // Button tel hinz einfügen
        kontaktFormularPanel.add(telefonnummerHinzufuegenButton,c);
        
        c.gridx= 1;
        
        //Button Telefonnummer ändern, Änderung übernehmen
        JButton telefonnummerAendernButton = new JButton("<html>Telefonnummer \u00C4ndern/<br />\u00C4nderung \u00FCbernehmen</html>");
        telefonnummerAendernButton.setFont(new Font("Arial", Font.BOLD, 10));
        telefonnummerAendernButton.addActionListener(e->{
            //System. out. printin(aenderung);
            
            // Wenn eine Nummer geandert wird, dann
            if (aenderung != -1){
                String telefonnummer = telefonnummerTextField. getText();
                String typ = typTextField.getText();
                //test imput
                if (typ. length()<1) typ= "NOTYPE";
                String oldNumber = "Typ: "+telefonnummerList.getSelectedValue().getTyp() + ", Number: " +telefonnummerList.getSelectedValue().getNummer ();
                telefonnummerListModel. set(aenderung, new Telefonnummer (telefonnummer, typ));
                aenderung=-1;
                telefonnummerTextField.setText("");
                typTextField.setText ("");
                JOptionPane.showMessageDialog(null, "Die alte Nummer '"+ oldNumber+ "' wurde zu Typ: "+typ+" mit der Nummer: "+telefonnummer+" ersetzt!");
            }
            else{
                // wenn noch keine Nummer geändert wird, dann
                if (telefonnummerList.getSelectedIndex() >= 0) {               
                    // aenderung = ausgewählte Zeile aus Telefonliste von Kontakt
                    aenderung = telefonnummerList.getSelectedIndex();
                    Telefonnummer tmp = telefonnummerList.getSelectedValue();
                    telefonnummerTextField.setText(tmp.getNummer());
                    typTextField.setText(tmp.getTyp());               
                }                               
                // Wenn. keine. Nummer ausgewählt. wurde, dann
                else JOptionPane.showMessageDialog(null, "Es muss eine Nummer ausgewählt werden!");
            }
        });
        // Button andern einfugen
        kontaktFormularPanel.add(telefonnummerAendernButton, c);
        c.gridx = 0;
        c.gridy++;
        c.gridwidth = 2;
        
        // Telefonnr.. Liste einfügen
        kontaktFormularPanel.add (telefonnummerScrollPane, c);
        c.gridx = 0;
        c.gridy++;
        c.gridwidth = 2;
        
        // Button Kontakt speichern
        JButton kontaktSpeichernButton = new JButton("Kontakt speichern");
        kontaktSpeichernButton.addActionListener(e-> {
            // get alle. Values aus den Feldern
            String name = nameTextField.getText();
            String adresse = adresseTextField.getText();
            String email = emailTextField.getText();
            
            // get Values aus der Liste
            List <Telefonnummer> telefonnummern = new ArrayList<>(telefonnummerListModel.size());
            for (int i = 0; i < telefonnummerListModel.size(); i++) {
                telefonnummern.add(telefonnummerListModel.getElementAt(1));
            }
            // teste, ob dein Kontakt mehr als 2 Nummern hat, falls es weniger als 2 sind, dann
            if (telefonnummern.size() < 2) JOptionPane.showMessageDialog(null, "Kontakt konnte nicht gespeichert werden, da mindestens 2 Nummern angegeben werden müssen");
            else {
                // Alle Bedingungen sind erfüllt, erstelle einen neuen Kontakt
                Kontakt kontakt = new Kontakt (name, adresse, email);
                kontakt.setTelefonnummern(telefonnummern);
                
                // wurde ein neuer Kontakt erstellt, dann
                if (selectedrow <0 || selectedrow >= manager.allKontaktesice()){
                manager.addKontakt(kontakt);
                }
                
                // wurde ein Kontakt bearbeitet, dann               
                else {
                    manager.kontaktbearbeiten (kontakt, selectedrow);
                    selectedrow= -1;
                }
                //Telefonbuch -> speichern -> enable
                menuBar.getMenu(0).getMenuComponent(1).setEnabled(true);
                setMenusavesettings();
                
                JOptionPane.showMessageDialog(null, "Kontakt wurde gespeichert.");
                resetKontaktFormular();
            }
        });
        // Button Kontakt speichern hinzufügen
        kontaktFormularPanel.add(kontaktSpeichernButton, c);
    }   
    
    // Setze alle Variablen im Kontaktformular zurück
    private void resetKontaktFormular() {
        nameTextField. setText("");
        adresseTextField.setText("");
        emailTextField.setText("");
        telefonnummerListModel.clear();
        telefonnummerTextField.setText("");
        typTextField.setText("");
        aenderung= -1;
    }
                    
    // Die Telefonbuch- Seite
    public void erstelleTelefonbPanel() {
        telefonbuchPanel = new JPanel (new FlowLayout ()) ;
        
        String[] spaltenname = {"Name", "Adresse", "Email", "Telefonnummern"};
        
        
        // Default-Tabel-Model ermöatlicht es einfach die Tabellendaten zu überschreiben
        //übergabewerte für den Konstruktor String [Ill Werte. , String] Spaltenname
        DefaultTableModel a = new DefaultTableModel (manager.getAllKontakte(), spaltenname);
        table = new JTable(a);
        
        // Die Tabelle markiert nicht nur. ein Wert sondern gleich die ganze Zeile
        table.setRowSelectionAllowed(true);
        
        // Ecstelle ein selector, der. bei einem einzigen Klick (SINGLE_INTERVAL_SELECTION) folgendes. Event auslöst
        ListSelectionModel select= table.getSelectionModel();
        select. setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        select.addListSelectionListener(new ListSelectionListener() {
        
            // Die ausgewählte Reihe ändert sich, somit
            public void valueChanged(ListSelectionEvent e) {
                selectedrow= table.getSelectedRow();
                // Wenn die ausgewählte Reihe zw 0 und Telefonbuch size ist, dann
                if (selectedrow > -1 && selectedrow <= manager.allKontaktesice())
                // Lade den Kontakt zum Bearbeiten
                changeValue();
            }
        });
        // fuge eine Scrollbar. hinzu -> ausgehend von der. Tabelle
        JScrollPane scrollPane=new JScrollPane(table);
        table.setFillsViewportHeight(true);
        //fuge der. TabellenSeite die Scrollbar. mit der. Tabelle hinzu
        telefonbuchPanel. add (scrollPane);
    }
        
    private void tableload(){
        changeScreen(TELB_SCREEN);
        //get all Tablevalues
        String [][] allvalues= manager.getAllKontakte();
        //model. setValueAt(value, row, column); // Again, you need to define the variables for your self
        for (int i=0; i< allvalues. length/4; i++){
            for (int j= 0; j<4; j++){
                table.setValueAt(allvalues[i][j],i,j);
            }
        }       
        table.clearSelection();
    }
        
        
        
    private void changeValue(){
        changeScreen(KONT_SCREEN);
        resetKontaktFormular();
        if (selectedrow>=0 && selectedrow <= manager.allKontaktesice()){
            Kontakt val= manager.kontaktbyid(selectedrow);
            nameTextField.setText(val.getName());
            adresseTextField.setText(val.getAdresse());
            emailTextField.setText(val.getEmail());
            telefonnummerListModel.clear();
            String telnummern="";
            for (int j=0; j<val.getTelefonnummern().size();j++){
                telnummern= telnummern+ val.getTelefonnummern().get(j).toString();
            }
            telefonnummerListModel.removeAllElements();
            for (int i= 0; i < val.getTelefonnummern().size(); i++){
                telefonnummerListModel.addElement(new Telefonnummer(val.getTelefonnummern().get(i).getNummer(),val.getTelefonnummern().get(i).getTyp()));
            }
            
        }
    }
        
            
        
    /*
    *Setze die Menüs auf die standard Einstellung:
    *Laden Beenden und neuer Kontakt ist an, Speichern aus
    */             
    public void setMenusettings (){
        //ladenMenuItem. setEnabled(true);
        //speichernMenuItem.setEnabled(false);
        //beendenMenuItem.setEnabled(true);
        //neuerKontaktMenuItem.setEnabled(true);
        // Telefonbuch -> Laden anzeigen -> enable
        menuBar.getMenu(0).getMenuComponent(0).setEnabled(true);   
        // Telefonbuch -> Speichern anzeigen -> disabled
        menuBar.getMenu (0) .getMenuComponent (1) .setEnabled (false);
        // Telefonbuch -> Beenden anzeigen -> enable
        menuBar.getMenu(0).getMenuComponent(2).setEnabled(true);
        // Kontakt -> neuer. Kontakt anzeigen -> enable
        menuBar. getMenu (1) .getMenuComponent (0) .setEnabled (true);
    }
    /* Stelle die Menüs. um
    * Murde. ein Kontakt erstellt oder ein Telefonbuch geladen, dann:
    * Alle Kontakte, Suchen und Löschen auf an
    */
    public void setMenusavesettings (){
        //Kontakt -> alle Kontakte anzeigen -> enable
        menuBar.getMenu (1) .getMenuComponent (1).setEnabled (true);
        //Kontakt -> Kontakt suchen -> enable
        menuBar. getMenu (1) . getMenuComponent (2). setEnabled (true);
        //Kontakt -> Kontakt löschen -> enable
        menuBar.getMenu (1) .getMenuComponent (3) .setEnabled(true);
    }
    
    private void changeScreen (String screen) {
        ((CardLayout) cardpanel.getLayout()).show(cardpanel, screen) ;
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new TelefonbuchGUI();
        });
        
    }
 }



2.Klasse

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;

import javax.swing.*;

/* TelefonbuchManager ist eine Verwalterklasse.
* Damit wird der. Schnittrunkt zw. der. GUI und Telefonbuch gesetzt
*/

public class TelefonbuchManager {
    
        
    
    private Telefonbuch telefonbuch;
    // letter Speicherpunkt
    private String speicherort;
    // die Maximale Länge von der. Tabelle -> Max Anzahl an Kontakten in dem Telefonbuch
    private int MAXLOADING = 256;
    
    // Konstruktor
    public TelefonbuchManager () {
        telefonbuch = new Telefonbuch();
        speicherort = "";
    }
    
    //Läd die Datei
    public void laden() {
        JFileChooser fileChooser = new JFileChooser ();
        int option = fileChooser.showOpenDialog(null);
        if (option == JFileChooser.APPROVE_OPTION) {
            try (FileInputStream fileIn = new FileInputStream(fileChooser.getSelectedFile());
                ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
                telefonbuch = (Telefonbuch) objectIn.readObject();
                speicherort = fileChooser. getSelectedFile () .getAbsolutePath ();
                //System.out.println("Telefonbuch geladen: " + speicherort);
            }
            catch (IOException | ClassNotFoundException e) {
                e. printStackTrace () ;
            }
        }
    }
    
    // Speichert eine Datei aus allen Elementen aus dem Telefonbuch
    public void speichern() {
        JFileChooser fileChooser = new JFileChooser();
        int option = fileChooser.showSaveDialog(null);
        if (option == JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            try (ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream(selectedFile))) {
                objectOut.writeObject(telefonbuch);
                speicherort = selectedFile.getAbsolutePath();
                //System.out.println("Telefonbuch gespeichert:" + speicherort);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    // Kontakt wird ins Telefonbuch gespeichert
    public void addKontakt (Kontakt kontakt) {
        telefonbuch.addKontakt(kontakt);
        //lastsave= true;
    }
    
    // gibt dieTLänge der. Telefonbuch -> Kontaktliste zurück
    public int allKontaktesice(){
        return telefonbuch.getKontakte ().size();
    }
    
    // Erstelle ein 2 dimensionalen String, wo in jeder Zeile ein Kontakt abgespeichert wird
    public String [][] getAllKontakte() {
        String [][] data = new String [MAXLOADING] [4];
        //data [0] [0]="Es wurden"; data [0] [1]="noch keine"; data [0] [2]="Daten";data [0] [3]="eingefügt!"
        List <Kontakt> tmp = telefonbuch.getKontakte();
        for (int i=0; i< tmp.size(); i++){
            Kontakt tmpKontakt = tmp.get (1) ;
            String telnummern = "";
            for (int j=0; j<tmpKontakt.getTelefonnummern().size();j++){
                telnummern= telnummern+ tmpKontakt.getTelefonnummern () .get (j).toString();
            }
            data [i] [0]= tmpKontakt.getName ( ) ;
            data [i] [1]= tmpKontakt.getAdresse() ;
            data [i] [2]= tmpKontakt.getEmail();
            data [i] [3]= telnummern;
        }
        
        return data;
   }
    
    // Kontakt an der Stelle ID wird überarbeitet
    public void kontaktbearbeiten (Kontakt kon, int row){
        telefonbuch.getKontaktbyID(row).setAdresse(kon.getAdresse());
        telefonbuch.getKontaktbyID(row).setEmail(kon.getEmail());
        telefonbuch.getKontaktbyID(row).setName(kon.getName());
        telefonbuch.getKontaktbyID(row).setTelefonnummern(kon.getTelefonnummern());
    }
    
    public Kontakt kontaktbyid(int id) {
        return telefonbuch.getKontaktbyID(id);
    }
    
    // suche ein Kontakt und liefer die ID zurück
    public int kontaktSuchen(String suchbegriff) {
        int i= 0;
        for (Kontakt kontakt : telefonbuch.getKontakte()) {
            if (kontakt.getName () .equalsIgnoreCase (suchbegriff)
                    || kontakt.getAdresse () .equalsIgnoreCase (suchbegriff)
                    || kontakt.getEmail().equalsIgnoreCase(suchbegriff)
                    || kontakt.getTelefonnummern().stream() . anyMatch (nummer -> nummer.getNummer () .equalsIgnoreCase(suchbegriff))) {
                JOptionPane.showMessageDialog(null, kontakt.getName ()+" wurde gefunden!");
                System.out.println(kontakt);
                return i;
            }
            i++;
        }
        return -1;
    }
    
    // suche ein Kontakt und lösche den Kontakt
    public void kontaktLoeschen () {
        String suchbegriff = JOptionPane. showInputDialog("Suchbegriff eingeben:");
        
        boolean kontaktGefunden = false;
        for (Kontakt kontakt : telefonbuch.getKontakte()) {
            if (kontakt.getName ().equalsIgnoreCase (suchbegriff)
                    || kontakt.getAdresse () .equalsIgnoreCase (suchbegriff)
                    || kontakt.getEmail().equalsIgnoreCase(suchbegriff)){
                JOptionPane. showMessageDialog(null, kontakt.getName ()+" wurde gelöscht!");
                         telefonbuch.removeKontakt(kontakt);
                         kontaktGefunden = true;
                         break;
                         }
        }
        
        if (!kontaktGefunden) {
            JOptionPane.showMessageDialog(null, "Dieser Kontakt existiert nicht!");
        }
    
   }
}


3.Klasse

import java.io.Serializable; //wird in Bytes ausgegeben, um in einer Datei speichern zu können

public class Telefonnummer implements Serializable {
    private static final long serialVersionUID = 5795718838416375953L;
    private String nummer;
    private String typ;
    
    public Telefonnummer(String nummer, String typ) {
        this.nummer = nummer;
        this.typ = typ;
    }
    
    public String getNummer () {
        return nummer;
    }
    
    public String getTyp() {
        return typ;
    }
    
    @Override
    public String toString() {
        return typ + ": " + nummer;
    }
}


4.Klasse

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Kontakt implements Serializable {
    private static final long serialVersionUID = -5315291695308264541L;
    private String name;
    private String adresse;
    private String email;
    private List<Telefonnummer> telefonnummern;
    
    
    public Kontakt (String name, String adresse, String email) {
        this. name = name;
        this.adresse = adresse;
        this.email = email;
        this.telefonnummern = new ArrayList<>();
    }
    
    public void addTelefonnummer (Telefonnummer telefonnummer) {
        telefonnummern.add (telefonnummer);
    }
    
    public void removeTelefonnummer (Telefonnummer telefonnummer) {
        telefonnummern.remove(telefonnummer);
    }
    
    public List<Telefonnummer> getTelefonnummern () {
        return telefonnummern;
    }
    
    @Override
    public String toString() {
        return "Name: " + name + "\nAdresse: " + adresse + "\nE-Mail: " + email + "\nTelefonnummern: " + telefonnummern;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName (String name) {
        this. name = name;
    }
    
    public String getAdresse() {
        return adresse;
    }
    
    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    public void setTelefonnummern (List<Telefonnummer> telefonnummern) {
        this. telefonnummern = telefonnummern;
    }
}


5.Klasse

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Telefonbuch implements Serializable {
    private static final long serialVersionUID = -2976418144078461174L;
    private List<Kontakt> kontakte;
    
    public Telefonbuch () {
        kontakte = new ArrayList<>();
    }
    
    public void addKontakt (Kontakt kontakt) {
        kontakte.add(kontakt);
    }
    
    public void removeKontakt (Kontakt kontakt) {
        kontakte.remove(kontakt);
    }
    
    public List<Kontakt> getKontakte() {
        return kontakte;
    }
    
    public Kontakt getKontaktbyID(int id){
        return kontakte.get(id);
    }
}
 

Oneixee5

Top Contributor
Die Zeilennummer siehst du im Stacktrace:
Code:
at hausarbeit_JAVA.TelefonbuchGUI.setMenusettings(TelefonbuchGUI.java:534)
Die willst die JMenuItems aktivieren - so ist das aber falsch:
Java:
        this.menuBar.getMenu(0).getMenuComponent(2).setEnabled(false);
Das funktioniert so:
Java:
        this.menuBar.getMenu(0).getItem(1).setEnabled(true);
getMenuComponent und getItem ist also nicht das Gleiche.
 

KonradN

Super-Moderator
Mitarbeiter
Und wenn Du die JMenuItem als Instanzvariablen deklarierst statt als lokale Variablen, dann müsstest Du die Elemente gar nicht erst dir geben lassen sondern könntest direkt schreiben: speichernMenuItem.setEnabled(true); und so.

Das macht es dann auch deutlich einfacher und vor allem besser lesbar. Das der Code unlesbar ist, merkst Du schon daran, dass Du selbst einen Kommentar davor gesetzt hast :).
 

Neue Themen


Oben