Klasse öffnen, mehrere Exceptions

  • Themenstarter Themenstarter Eleandro
  • Beginndatum Beginndatum
E

Eleandro

Gast
Hi Leute,

Ich versuche krampfhaft, ein Fenster in meiner Main-Klasse zu öffnen. D.h., ich habe eine Klasse "Profiloptionen", wo ein eigenes Fenster beschrieben ist und in Mühle.java, wo ich auch meine Main habe, will ich via ActionListener dieses Fenster aufrufen und starten. Doch ständig werde ich mit folgenden Fehlern geärgert:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gui.Muehle$12.actionPerformed(Muehle.java:380) (--> das ist genau die Stelle, an der "Profiloptionen" gestartet werden soll)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1225)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1266)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Das Hauptfenster (ein Mühlespielbrett, oben mit MenuItems, wo auch "Profiloptionen" geöffnet werden soll) startet erst ohne Probleme. Doch sobald ich auf den Menüeintrag "Profiloptionen" klicke, öffnet sich nicht mein neues Fenster, sondern meine Frustration vergrößert sich jedes Mal ein Stück mehr.

Der Meüeintrag:
Java:
menu = new JMenu("Profile");
        menuItem = new JMenuItem("Profiloptionen");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                profiloptionen.setVisible(true);
            }
        });
        menu.add(menuItem);

Ich vermute mal, ihr braucht auch den Quelltext von Profiloptionen, der ist halt etwas länger...
Java:
package gui;



import java.awt.Color;
import engine.Datenbank;
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.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import model.Profil;
import model.Profilspeicher;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Stellt die Profileinstellungen dar
 * @author Andi
 */


public class Profiloptionen extends JDialog implements ActionListener, ProfilListener {


    //Instanzvariablen
    JButton abbrechen = new JButton("Abbrechen");
    JButton neuesSpiel = new JButton("Neues Spiel starten");
    Profilspeicher ps;
    JComboBox spieler1;
    JComboBox spieler2;
    Muehle muehle;

    //Instanzvariablen für Profil erstellen
    JTextField textField = new JTextField(12);
    JButton profilAnlegen = new JButton("Profil anlegen");
    Highscore highscore;

    //Instanzvariablen für Profil löschen
    JComboBox profile;
    JButton profilLöschen = new JButton("Profil löschen");



    // Konstruktor    (aus Klammer wurde entfernt Datenbank)
    public Profiloptionen(  Muehle muehle, Highscore highscore) {

        super(muehle, true);
        this.muehle = muehle;

        //Profilspeicher als Instanzvaraible anlegen
//        this.ps = ps;

        this.highscore = highscore;

        // als Listener anmelden
        ps.addProfilListener(this);



        // Layout festlegen
        super.setTitle("Profiloptionen");
        getContentPane().setBackground(Color.LIGHT_GRAY);
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        super.setLayout( new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

       
        // Fenster in Mitte positionieren
        Dimension fenstergröße =  new Dimension( 500, 400);  // Fenstergröße laut pack() ermittelt
        Dimension bildschirmgröße = Toolkit.getDefaultToolkit().getScreenSize();  // ermittlet Bildschirmgröße
        int y = (int) (bildschirmgröße.getHeight() - fenstergröße.getHeight()) / 2;    // y-Koordinate des Fenstes
        int x = (int) (bildschirmgröße.getWidth() - fenstergröße.getWidth()) / 2;   // x-Koordinate des Fenstes
        setSize(fenstergröße);   // Fenstergröße zuweisen
        setLocation( x, y);      // Positionierung des Fensters


        //Label einfügen: Spieler auswählen, Zeile 0
        c.gridx = 0;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
        JLabel labelSpielerauswählen = new JLabel("Spieler auswählen:");
        labelSpielerauswählen.setFont(new Font("Arial", Font.BOLD, 14));
        add(labelSpielerauswählen, c);


        //Label einfügen für Spieler 1, Zeile 1
        c.gridx = 0;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.REMAINDER; // davor wars hier 1
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
        JLabel labelSpieler1 = new JLabel("Spieler Schwarz:");
        labelSpieler1.setFont(new Font("Arial", Font.BOLD,  14));
        add(labelSpieler1, c);

        //ImageIcon einfügen (Schwarzer Stein), Zeile 1
        c.gridx = 1;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,10,0,0);
        ImageIcon weißerStein = new ImageIcon("gui\\spielerSchwarz.gif");
        JLabel stein1 = new JLabel(weißerStein);
        add(stein1, c);

         //ComboBox einfügen, Zeile 1
        c.gridx = 2;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,15,0,0);
//        spieler1 = new JComboBox( new DefaultComboBoxModel( muehle.getDatenbank().execute("SELECT name FROM statistik") ));
        add(spieler1, c);


        //Label einfügen für Spieler 2, Zeile 2
        c.gridx = 0;
        c.gridy = 2;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(15,5,0,0);
        JLabel labelSpieler2 = new JLabel("Spieler Weiß:");
        labelSpieler2.setFont(new Font("Arial", Font.BOLD, 14));
        add(labelSpieler2, c);

        //ImageIcon einfügen (Weißer Stein), Zeile 2
        c.gridx = 1;
        c.gridy = 2;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(5,10,0,0);
        ImageIcon schwarzerStein = new ImageIcon("src\\gui\\spielerWeiß.gif");
        JLabel stein2 = new JLabel(schwarzerStein);
        add(stein2, c);

         //ComboBox einfügen, Zeile 2
        c.gridx = 2;
        c.gridy = 2;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(5,15,0,0);
//        spieler2 = new JComboBox( new DefaultComboBoxModel((Vector) ps.getProfilnamen()));
        add(spieler2, c);

         //Label für  Profilerstellen, Zeile 3
        c.gridx = 0;
        c.gridy = 3;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.WEST;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(30,5,0,0);
        JLabel profilErstellen = new JLabel("Profil erstellen:");
        profilErstellen.setFont(new Font("Arial", Font.BOLD, 14));
        add(profilErstellen, c);
        
        //Label für Funktion Profilerstellen, Zeile 4
        c.gridx = 0;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.WEST;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
        JLabel profilname = new JLabel("Profilname:");
        profilname.setFont(new Font("Arial", Font.BOLD, 14));
        add(profilname, c);


        //Textfield für die Eingabe des neuen Spielernamens, Zeile 4
        c.gridx = 1;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.WEST;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
        add(textField, c);

        //Button zum Speichern des neuen Profils, Zeile 4
        c.gridx = 2;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.CENTER;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,80,0,0);
        add(profilAnlegen, c);

        // Label für Spieler löschen, Zeile 5
        c.gridx = 0;
        c.gridy = 5;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.WEST;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(30,5,0,0);
        JLabel profilLoeschen = new JLabel("Profil löschen:");
        profilLoeschen.setFont(new Font("Arial", Font.BOLD, 14));
        add(profilLoeschen, c);

        // Label Spielerwählen (für Spieler löschen), Zeile 6
        c.gridx = 0;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.WEST;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
        JLabel profilName1 = new JLabel("Profil wählen:");
        profilName1.setFont(new Font("Arial", Font.BOLD, 14));
        add(profilName1, c);

        //JComboBox um Spieler auszuwählen, Zeile 6
        c.gridx = 1;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,5,0,0);
//        profile = new JComboBox (new DefaultComboBoxModel( (Vector) ps.getProfilnamen()));
        add(profile, c);


        //Button um Spieler zu löschen, Zeile 6
        c.gridx = 2;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.CENTER;
        c.weightx = 0;
        c.weighty = 0;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10,80,0,0);
        
        add(profilLöschen, c);
        
        
        //2 Buttons einfügen, Zeile 7
        c.gridx = 0;
        c.gridy = 7;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.weightx = 0;
        c.weighty = 0;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(15,0,10,0);
        JPanel panel = new JPanel();
        panel.setOpaque(false);
        panel.setLayout( new FlowLayout(FlowLayout.LEFT));
        add(panel, c);

        //Listener für Neues Spiel
       neuesSpiel.addActionListener(new ActionListener (){
            public void actionPerformed (ActionEvent e){

                    muehle.neuesSpielAnlegen();  //muehle.neues....?        --> hier der Fehler: local variable muehle is accessed from within inner class; needs to be declared final
                    setVisible(false); //Fenster schließen
                    // neues Spiel beginnen
             }

        });
        panel.add(neuesSpiel);
        panel.add( Box.createHorizontalGlue());

        //Listener für Abbrechen-Button
        abbrechen.addActionListener(new ActionListener (){
            public void actionPerformed (ActionEvent e){
                setVisible(false);
            }
        });
        panel.add(abbrechen);
        panel.add( Box.createHorizontalGlue());



        //Listener für die Buttons
        neuesSpiel.addActionListener(this);
        abbrechen.addActionListener(this);
        profilAnlegen.addActionListener( this);
        profilLöschen.addActionListener(this);
        }

    
    public boolean überprüfeProfile() {
        if( spieler1.getSelectedItem() == spieler2.getSelectedItem()) {
            return true;
        }
        else return false;
    }


    //ActionListener für Neues Spiel
   public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        if(  button == neuesSpiel) {
                muehle.neuesSpielAnlegen();
                this.setVisible(false); //Fenster schließen
                // neues Spiel beginnen
            } 

       
        //ActionListener um das Profil anzulegen  
         else  if (button == profilAnlegen) {
            String name = textField.getText();
                boolean b = ps.gleichheitÜberpfüfen(name);
                if (!(b)) {
                    if (textField.getText().length() <= 15) {
                        try {
                            ps.profilAnlegen(name);  // neues Profil anlegen
                            JOptionPane.showMessageDialog(Profiloptionen.this, "Profil wurde angelegt", "Information", JOptionPane.INFORMATION_MESSAGE);
                            textField.setText("");
                            textField.requestFocus();
                        } catch (Exception ex) {
                            // nothing
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "Profilname ist zu lang", "Information", JOptionPane.INFORMATION_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Profilname ist schon vergeben", "Information", JOptionPane.INFORMATION_MESSAGE);
                    textField.requestFocus();
                }

        } 

         //ActionListener um ein Profil zu löschen
         else if ( button == profilLöschen) {
            int result = JOptionPane.showConfirmDialog(Profiloptionen.this, "Sind Sie sicher?", "Bestätigung", JOptionPane.YES_NO_OPTION);
            if (result == JOptionPane.YES_OPTION) {
//                ps.profilLöschen( (String) profile.getSelectedItem());
                JOptionPane.showMessageDialog(Profiloptionen.this, "Profil wurde gelöscht", "Bestätigung", JOptionPane.INFORMATION_MESSAGE);
            }
        }
        else {
            this.setVisible(false);   // Fenster schließen
        }
    };

    //ActionListener für den Abbrechen-Button
    public void actionPerformed3(ActionEvent eev) {
        JButton button = (JButton) eev.getSource();
        if (button ==  abbrechen) {
            this.setVisible(false);
        }
    }



    // implementierte Methode des Interface
    public void profilHinzufügen(String profilname) {
        spieler1.setModel( new DefaultComboBoxModel( (Vector) ps.getProfilnamen()));
        spieler2.setModel( new DefaultComboBoxModel( (Vector) ps.getProfilnamen()));
    }

    public void profilLöschen( String profilname) {
        spieler1.setModel( new DefaultComboBoxModel( (Vector) ps.getProfilnamen()));
        spieler2.setModel( new DefaultComboBoxModel( (Vector) ps.getProfilnamen()));
    }


    public JButton getAbbrechen() {
        return abbrechen;
    }

    public void setAbbrechen(JButton abbrechen) {
        this.abbrechen = abbrechen;
    }


    public JButton getNeuesSpiel() {
        return neuesSpiel;
    }

    public void setNeuesSpiel(JButton neuesSpiel) {
        this.neuesSpiel = neuesSpiel;
    }

    public Profilspeicher getPs() {
        return ps;
    }

    public void setPs(Profilspeicher ps) {
        this.ps = ps;
    }

    public JComboBox getSpieler1() {
        return spieler1;
    }

    public void setSpieler1(JComboBox spieler1) {
        this.spieler1 = spieler1;
    }

    public JComboBox getSpieler2() {
        return spieler2;
    }

    public void setSpieler2(JComboBox spieler2) {
        this.spieler2 = spieler2;
    }

}

Weiter oben gibts auch noch ein kleies Problem mit ner lokalen Variable und inner class. Oh je, das Ding macht mich fertig! Könnt ihr mir helfen?? Bitte....
 
Ich würde mal vermuten [c]profiloptionen.setVisible(true);[/c] ist das Problem da es null ist. Hast du irgendwo soetwas wie [c]Profileoptionen profileoptionen = new Profileoptionen()[/c] in deinem Code?

Der Quellcode von Profiloptionen ist da der falsche Codeausschnitt. Da müsstest du eher den Quellcode von deiner anderen GUI Klasse posten.

Zu dem inner class problem - dazu musst du dann [c]profiloptionen[/c] als final deklarieren. Du kannst aber auch einfach im ActionListener immer ein neues Profiloptionen Fenster anlegen.

Java:
        menuItem.addActionListener(new ActionListener() {
 
            public void actionPerformed(ActionEvent ev) {
                Profiloptionen profiloptionen = new Profiloptionen(); // immer ein neuse Fenster anlegen...
                profiloptionen.setVisible(true);
            }
        });
 
Zuletzt bearbeitet von einem Moderator:
Hi,

wurde die Variable "profiloptionen" denn schon in dem ersten Code-Abschnitt belegt? Wenn hinter der Variable
kein Objekt steckt dann fliegt natürlich eine NPE wenn du eine Methode aufrufen willst.

Edit: Mist zu langsam 😉
 
Hey,

Ja, hatte ich schon mal drin, lief aber trotzdem nicht wirklich.

Folgendes steht nun in

public class Muehle extends JFrame{

//hier werden versch. Datenfelder angegeben, u.a. auch:
Profiloptionen profiloptionen;

public Muehle() {
super("Mühle");
etc....

profiloptionen = new Profiloptionen(); --> nun folgender Fehler: cannot find Symbol ?? oben stehts doch da?

komplette Fehlermeldung, die links als rotes Ausrufezeichen erscheint (NetBeans):
cannot find symbol
symbol: constructor Profiloptionen()
location: class.gui.Profiloptionen
 
Hui, ihr seid ja richtig schnell 🙂 :O

Hab noch gar nicht bemerkt, dass editiert wurde und noch ein Beitrag gekommen ist. Ich versuchs mal eure Tipps umzusetzen.

Ist ja der Hammer, wie schnell das Forum ist 🙂
 
HI,

scheint noch nicht zu klappen, er findet immer noch kein Symbol. Ich habe euch deshalb wie vorgeschlagen den kompletten Code von Muehle () reinkopiert:

In Z.65 wird das Datenfeld angelegt für Profiloptionen.
in Z.107 wollte ich das Fenster erst anlegen, aber sobald ich das wieder auskommentiere, findet er kein Symbol.
in Z.383 ist der ActionListener und der versuchte Aufruf, aber auch wird kein Symbol gefunden; new Profiloptionen() ist rot unterlegt.

Java:
package gui;

import engine.Datenbank;
import engine.Feld;
import engine.NeuesSpiel;
import gui.Highscore.Resultat;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import model.Profilspeicher;
import model.Spieler;
import java.io.File;
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
//import javax.media.*;

/**
 *
 * @author Andi
 */
public class Muehle extends JFrame{

    // Datenfelder
    JLabel spielerSchwarzLabel;
    JLabel spielerWeissLabel;
    JLabel meldung;
    Spielbrett spielbrett;
    Spielsteine schwarzeSteine;   // linke Seite vom Spielfeld
    Spielsteine weisseSteine;  // rechte Steite vom Spielfeld
    Info info;
    Highscore highscore;
    ProfileZuordnen profileZuordnen;
    ProfilLöschen profilLöschen;
    ProfilErstellen profilErstellen;
    Profilspeicher ps;
    NeuesSpiel neuesSpiel;
    String pfad;
    Datenbank datenbank;
    
    Profiloptionen profiloptionen;
    //String AudioPfad = "C:\\Games\\tes4title.mp3";
    //File datei = new File(AudioPfad);
   
        
    

    // Konstruktor
    public Muehle() {

        super("Mühle");
        super.setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        fenstergrösseFestlegen();
        menueleisteEinbauen();
        //AudioClip = backgroundSound;
        //backgroundSound = getAudioClip(getCodeBase(),"C:/Games/tes4title.mp3");


        // dieses Fenster als WindowListener anmelden, um Profile speichern zu können
        this.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent ev) {
                highscore.speichereProfildaten();
                ps.speichereProfilnamen();
                if (neuesSpiel != null) {
                    int result = JOptionPane.showConfirmDialog(Muehle.this, "Wollen Sie die aktuelle Partie speichern?", "Warnung", JOptionPane.YES_NO_OPTION);
                    if (result == JOptionPane.YES_OPTION) {
                        speicherePartie(0);
                    }
                }
            }
        });


        // Fenster-Objekte anlegen
        ps = new Profilspeicher(this, highscore);
        profilErstellen = new ProfilErstellen(ps, this, highscore);
        profilLöschen = new ProfilLöschen(ps, this);
        profileZuordnen = new ProfileZuordnen(ps, this);
        highscore = new Highscore(ps);
        info = new Info();
//        profiloptionen = new Profiloptionen();
        
        






        //Layout festlegen
        this.setLayout(new BorderLayout());
        this.setBackground(Color.LIGHT_GRAY);


        // NORTH-PANEL
        JPanel northPanel = new JPanel();
        northPanel.setBackground(Color.LIGHT_GRAY);
        add(northPanel, BorderLayout.NORTH);

        northPanel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        // Label für Spieler1
        c.gridx = 0;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(10, 10, 10, 10);
        spielerSchwarzLabel = new JLabel("Spieler 1", JLabel.CENTER);
        spielerSchwarzLabel.setFont(new Font("Arial", Font.BOLD, 16));
        spielerSchwarzLabel.setPreferredSize(new Dimension(130, 30));
        spielerSchwarzLabel.setBorder(BorderFactory.createRaisedBevelBorder());
        spielerSchwarzLabel.setOpaque(true);
        spielerSchwarzLabel.setBackground(Color.LIGHT_GRAY);
        northPanel.add(spielerSchwarzLabel, c);


        // Label Meldung
        c.gridx = 1;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.RELATIVE;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = GridBagConstraints.CENTER;
        c.insets = new Insets(10, 10, 10, 10);
        meldung = new JLabel("");
        meldung.setFont(new Font("Arial", Font.BOLD, 16));
        meldung.setBackground(Color.LIGHT_GRAY);
        northPanel.add(meldung, c);


        // Label für Spieler2
        c.gridx = 2;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(10, 10, 10, 10);
        spielerWeissLabel = new JLabel("Spieler 2", JLabel.CENTER);
        spielerWeissLabel.setFont(new Font("Arial", Font.BOLD, 16));
        spielerWeissLabel.setPreferredSize(new Dimension(130, 30));
        spielerWeissLabel.setBorder(BorderFactory.createRaisedBevelBorder());
        spielerWeissLabel.setOpaque(true);
        spielerWeissLabel.setBackground(Color.LIGHT_GRAY);
        northPanel.add(spielerWeissLabel, c);


        // WEST-PANEL
        JPanel westPanel = new JPanel();
        westPanel.setBackground(Color.LIGHT_GRAY);
        westPanel.setPreferredSize(new Dimension(75, 500));
        schwarzeSteine = new Spielsteine(Color.BLACK, 17, 40);
        schwarzeSteine.setPreferredSize(new Dimension(75, 500));
        westPanel.add(schwarzeSteine);
        add(westPanel, BorderLayout.WEST);



        // EAST-PANEL
        JPanel eastPanel = new JPanel();
        eastPanel.setBackground(Color.LIGHT_GRAY);
        eastPanel.setPreferredSize(new Dimension(75, 500));
        weisseSteine = new Spielsteine(Color.WHITE, 17, 40);
        weisseSteine.setPreferredSize(new Dimension(75, 500));
        eastPanel.add(weisseSteine);
        add(eastPanel, BorderLayout.EAST);



        // SOUTH-PANEL
        JPanel southPanel = new JPanel();

//        JButton buttonMusikAn = new JButton("Sound an");
//        buttonMusikAn.addActionListener(new ActionListener() {
//            public void actionPerformed(ActionEvent ev) {
//                String cmd = ev.getActionCommand();
//                if (cmd.equals("Sound an")){
//                   //backgroundSound.play();
//                }
//                else{
//                }

                //Player audioPlayer = Manager.createRealizedPlayer(file.toURL());
                //audioPlayer.start();
//            }
//        });

        JButton buttonNeuesSpiel = new JButton("Neues Spiel");
        buttonNeuesSpiel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                neuesSpielAnlegen();
            }
        });


        JButton buttonSpielregeln = new JButton("Spielzug rückgängig");
        buttonSpielregeln.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                if(neuesSpiel.isInteraktion() == true  &  neuesSpiel != null){
                    ladePartie(1);
                }
            }
        });


        JButton buttonBeenden = new JButton("Unentschieden");
        buttonBeenden.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                unentschieden(); // keiner gewinnt;
            }
        });


        JButton buttonMusikAn = new JButton("Sound an");
        buttonMusikAn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                try{
                   new ProcessBuilder( "cmd", "/c", "src\\gui\\Jump.mp3" ).start();

               }catch (Exception exp){};
//                String cmd = ev.getActionCommand();
//                if (cmd.equals("Sound aus")){
//                   //backgroundSound.stop();
//                }
//                else{
//                }
                //Player audioPlayer = Manager.createRealizedPlayer(file.toURL());
               //audioPlayer.stop();
            }
        });



        southPanel.setBackground(Color.LIGHT_GRAY);
//        southPanel.add(buttonMusikAn);
        southPanel.add(buttonNeuesSpiel);
        southPanel.add(buttonSpielregeln);
        southPanel.add(buttonBeenden);
        southPanel.add(buttonMusikAn);

        add(southPanel, BorderLayout.SOUTH);



        //CENTER-COMPONENT
        spielbrett = new Spielbrett();
        spielbrett.setPreferredSize(new Dimension(450, 450));
//        spielbrett.addMouseListener(neuesSpiel);  // SteinePlatzierer informieren nach Mausklick
        add(spielbrett, BorderLayout.CENTER);



    }

    public void fenstergrösseFestlegen() {
        Dimension fenstergröße = new Dimension(606, 587);  // Fenstergröße unseres Programms
        Dimension bildschirmgröße = Toolkit.getDefaultToolkit().getScreenSize();  // ermittlet Bildschirmgröße
        int y = (int) (bildschirmgröße.getHeight() - fenstergröße.getHeight()) / 2;    // y-Koordinate des Fenstes
        int x = (int) (bildschirmgröße.getWidth() - fenstergröße.getWidth()) / 2;   // x-Koordinate des Fenstes
        setSize(fenstergröße);   // Fenstergröße zuweisen
        setLocation(x, y);      // Positionierung des Fensters
    }

    // MENÜLEISTE - steuert die Menüleiste und öffnet und schließt Fenster
    public void menueleisteEinbauen() {

        JMenuBar menuBar = new JMenuBar();
        JMenuItem menuItem;

        //-----------------------------------------------------------------

        JMenu menu = new JMenu("Programm");


        menuItem = new JMenuItem("Neues Spiel");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                neuesSpielAnlegen();
            }
        });
        menu.add(menuItem);



        menuItem = new JMenuItem("Beenden");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                highscore.speichereProfildaten();
                ps.speichereProfilnamen();
                System.exit(0);
            }
        });
        menu.add(menuItem);


        menuBar.add(menu);

        //-------------------------------------------------------------------

        menu = new JMenu("Spiel");
        menuItem = new JMenuItem("Spielzug rückgängig");
        menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                if(neuesSpiel.isInteraktion() == true & neuesSpiel != null){
                    ladePartie(1);
                }
            }
        });
        menu.add(menuItem);

        menuItem = new JMenuItem("Partie unentschieden");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                unentschieden();
            }
        });
        menu.add(menuItem);

        menuItem = new JMenuItem("Partie speichern");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                speicherePartie(0);
            }
        });
        menu.add(menuItem);


        menuItem = new JMenuItem("Partie laden");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                ladePartie(0);
            }
        });
        menu.add(menuItem);

        menuBar.add(menu);

        //-----------------------------------------------------------------

        menu = new JMenu("Profile");
        menuItem = new JMenuItem("Profiloptionen");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                
                Profiloptionen profiloptionen = new Profiloptionen();
                profiloptionen.setVisible(true);
            }
        });
        menu.add(menuItem);

        
        //alte Fenster, deren Funktiontionen alle in Profiloptionen verfügbar sein sollen
//        menuItem = new JMenuItem("Profil erstellen");
//        menuItem.addActionListener(new ActionListener() {
//
//            public void actionPerformed(ActionEvent ev) {
//                profilErstellen.setVisible(true);
//            }
//        });
//        menu.add(menuItem);
//
//        menuItem = new JMenuItem("Profil löschen");
//        menuItem.addActionListener(new ActionListener() {
//
//            public void actionPerformed(ActionEvent ev) {
//                profilLöschen.setVisible(true);
//            }
//        });
        menu.add(menuItem);
        menuBar.add(menu);

        menuItem = new JMenuItem("Profildatenbank");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                new LibraryGUI().setVisible( true);
            }
        });
        menu.add(menuItem);
        menuBar.add(menu);
        //-----------------------------------------------------------------


        menu = new JMenu("Fenster");
        menuItem = new JMenuItem("Statistik");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                highscore.setVisible(true);
            }
        });
        menu.add(menuItem);

        menuItem = new JMenuItem("Spielregeln");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                //regeln.setVisible(true);
                
               try{
                   new ProcessBuilder( "cmd", "/c", "src\\gui\\Mühle Spielregeln.pdf" ).start();

               }catch (Exception exp){};


         //       try {
	//		Runtime.getRuntime().exec("cmd.exe /c C:\\Users\\Daniel Autenrieth\\Desktop\\FH Dateien\\Programmieren\\Projekt\\Mühle_Test\\Mühle_Test\\src\\gui\\muehle_regeln.pdf");
	//	} catch (IOException e) {
			// TODO Auto-generated catch block
	//		e.printStackTrace();
	//	}
                }
        });
        menu.add(menuItem);

        menuItem = new JMenuItem("Programminfo");
        menuItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ev) {
                info.setVisible(true);
            }
        });
        menu.add(menuItem);

        menuBar.add(menu);


        //-----------------------------------------------------------------


        setJMenuBar(menuBar);  // Menüleise einfügen
    }

    // erneuert die komplette Oberfläche, wenn ein neues Spiel begonnen wird
    public void oberflächeErneuern() {
        spielerSchwarzLabel.setText((String) profileZuordnen.getSpieler1().getSelectedItem());
        spielerWeissLabel.setText((String) profileZuordnen.getSpieler2().getSelectedItem());
        spielerSchwarzLabel.setBackground(Color.GREEN); // Spieler 1 soll beginnen (=grün)
        spielerWeissLabel.setBackground(Color.LIGHT_GRAY);  // Spieler 2 muss warten

        spielbrett.setMarkierung(null);
        spielbrett.entferneAlleSteine();
        spielbrett.repaint();

        schwarzeSteine.steineAuffüllen(Color.BLACK, 17, 40);
        schwarzeSteine.repaint();
        weisseSteine.steineAuffüllen(Color.WHITE, 17, 40);
        weisseSteine.repaint();

        meldung.setText("Stein platzieren");
    }

    public void neuesSpielAnlegen() {
        if (neuesSpiel == null) {
            if (profileZuordnen.überprüfeProfile()) {
                JOptionPane.showMessageDialog(Muehle.this, "Spieler 1 und 2 haben das gleiche Profil", "Information", JOptionPane.INFORMATION_MESSAGE);
            } else {
                spielbrett.removeMouseListener(neuesSpiel);
                neuesSpiel = new NeuesSpiel(this);
                spielbrett.addMouseListener(neuesSpiel);
                // Tabelle aktuallisieren
                highscore.werteAktualisieren((String) profileZuordnen.getSpieler1().getSelectedItem(), Resultat.SPIEL_BESTRITTEN);
                highscore.werteAktualisieren((String) profileZuordnen.getSpieler2().getSelectedItem(), Resultat.SPIEL_BESTRITTEN);
            }
        } else {
            int result = JOptionPane.showConfirmDialog(Muehle.this, "Wollen Sie die aktuelle Partie verwerfen?", "Warnung", JOptionPane.YES_NO_OPTION);
            if (result == JOptionPane.YES_OPTION) {
                spielbrett.removeMouseListener(neuesSpiel);
                neuesSpiel = null;
                neuesSpiel = new NeuesSpiel(Muehle.this);
                spielbrett.addMouseListener(neuesSpiel);
                // Tabelle aktualisieren
                highscore.werteAktualisieren((String) profileZuordnen.getSpieler1().getSelectedItem(), Resultat.SPIEL_BESTRITTEN);
                highscore.werteAktualisieren((String) profileZuordnen.getSpieler2().getSelectedItem(), Resultat.SPIEL_BESTRITTEN);
            }
        }
    }

    public void ladePartie(int dateiindex) {
        int beenden = 0;
        if (dateiindex == 0) {
            pfad = "src\\files\\Spielstand.txt";
        } else {
            pfad = "src\\files\\Spielposition";
        }
        if (dateiindex == 0) {
            if (neuesSpiel != null) {
                int result = JOptionPane.showConfirmDialog(Muehle.this, "Wollen Sie die aktuelle Partie verwerfen?", "Warnung", JOptionPane.YES_NO_OPTION);
                if (result == JOptionPane.NO_OPTION) {
                    beenden = -1;
                }
            }
        }
        if (beenden != -1) {
            spielbrett.removeMouseListener(neuesSpiel);
            neuesSpiel = null;
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(pfad));
                Spieler spielerWeiss = (Spieler) ois.readObject();
                Spieler spielerSchwarz = (Spieler) ois.readObject();
                NeuesSpiel.Aktion aktion = (NeuesSpiel.Aktion) ois.readObject();
                NeuesSpiel.Farbe spielerAnReihe = (NeuesSpiel.Farbe) ois.readObject();
                Feld[][] felder = (Feld[][]) ois.readObject();
                Feld markiertesFeld = (Feld) ois.readObject();
                //---------------------------
                spielbrett.steine = (ArrayList) ois.readObject();
                spielbrett.markierung = (Shape) ois.readObject();
                //---------------------------
                schwarzeSteine.steine = (ArrayList) ois.readObject();
                weisseSteine.steine = (ArrayList) ois.readObject();
                schwarzeSteine.setAnzahlSteine(ois.readInt());
                weisseSteine.setAnzahlSteine(ois.readInt());
                //--------------------------
                meldung.setText((String) ois.readObject());
                spielerWeissLabel.setText((String) ois.readObject());
                spielerWeissLabel.setBackground((Color) ois.readObject());
                spielerSchwarzLabel.setText((String) ois.readObject());
                spielerSchwarzLabel.setBackground((Color) ois.readObject());


                // Darstellungen neu zeichnen....
                neuesSpiel = new NeuesSpiel(this, spielerWeiss, spielerSchwarz, aktion, spielerAnReihe, markiertesFeld, felder, spielbrett);
                spielbrett.addMouseListener(neuesSpiel);
                spielbrett.repaint();
                weisseSteine.repaint();
                schwarzeSteine.repaint();

                ois.close();

            } catch (Exception ex) {
                System.err.println(ex.getMessage());
            }


        }
    }

    public void speicherePartie(int dateiindex) {
        if (dateiindex == 0) {
            pfad = "src\\files\\Spielstand.txt";
        } else {
            pfad = "src\\files\\Spielposition";
        }
        if (neuesSpiel != null) {
            try {
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(pfad));
                oos.writeObject(neuesSpiel.spielerWeiss);
                oos.writeObject(neuesSpiel.spielerSchwarz);
                oos.writeObject(neuesSpiel.aktion);
                oos.writeObject(neuesSpiel.spielerAnReihe);
                oos.writeObject(neuesSpiel.felder);
                oos.writeObject(neuesSpiel.markiertesFeld);
                //---------------------------------------------
                oos.writeObject(spielbrett.steine);
                oos.writeObject(spielbrett.markierung);
                //-----------------------------------------------
                oos.writeObject(schwarzeSteine.steine);
                oos.writeObject(weisseSteine.steine);
                oos.writeInt(schwarzeSteine.getAnzahlSteine());
                oos.writeInt(weisseSteine.getAnzahlSteine());
                //-----------------------------------------------
                oos.writeObject(meldung.getText());
                oos.writeObject(spielerWeissLabel.getText());
                oos.writeObject(spielerWeissLabel.getBackground());
                oos.writeObject(spielerSchwarzLabel.getText());
                oos.writeObject(spielerSchwarzLabel.getBackground());

                oos.close();

                if (dateiindex == 0) {
                    JOptionPane.showMessageDialog(Muehle.this, "Partie gespeichert", "Information", JOptionPane.INFORMATION_MESSAGE);
                }
            } catch (Exception ex) {
                System.err.println(ex.getMessage());
            }

        }
    }

    public void unentschieden() {
        spielbrett.removeMouseListener(neuesSpiel);
        neuesSpiel = null;
        JOptionPane.showMessageDialog(Muehle.this, "Partie endet unentschieden", "Information", JOptionPane.INFORMATION_MESSAGE);
    }

    // get-Methoden
    public ProfileZuordnen getProfile() {
        return profileZuordnen;
    }

    public Profilspeicher getPs() {
        return ps;
    }

    public Spielsteine getSchwarzeSteine() {
        return schwarzeSteine;
    }

    public Spielbrett getSpielbrett() {
        return spielbrett;
    }

    public JLabel getSpielerSchwarz() {
        return spielerSchwarzLabel;
    }

    public JLabel getSpielerWeiss() {
        return spielerWeissLabel;
    }

    public Spielsteine getWeisseSteine() {
        return weisseSteine;
    }

    public JLabel getMeldung() {
        return meldung;
    }

    public void setMeldung(String text) {
        meldung.setText(text);
    }

    public void spielerSchwarzGewinnt() {
        JOptionPane.showMessageDialog(Muehle.this, spielerSchwarzLabel.getText() + " gewinnt das Spiel", "Information", JOptionPane.INFORMATION_MESSAGE);
        spielbrett.removeMouseListener(neuesSpiel);
        neuesSpiel = null;
        highscore.werteAktualisieren(spielerSchwarzLabel.getText(), Resultat.SIEG);
        highscore.werteAktualisieren(spielerWeissLabel.getText(), Resultat.NIEDERLAGE);
    }

    public void spielerWeissGewinnt() {
        JOptionPane.showMessageDialog(Muehle.this, spielerWeissLabel.getText() + " gewinnt das Spiel", "Information", JOptionPane.INFORMATION_MESSAGE);
        spielbrett.removeMouseListener(neuesSpiel);
        neuesSpiel = null;
        highscore.werteAktualisieren(spielerWeissLabel.getText(), Resultat.SIEG);
        highscore.werteAktualisieren(spielerSchwarzLabel.getText(), Resultat.NIEDERLAGE);
    }

    // main-Methode
    public static void main(String[] args) {
        Muehle spiel = new Muehle();
        spiel.setVisible(true);
        new Datenbank();


    }
}
 
Wie ich schon sagte.

Entweder du definierst die Variable als final - dann kannst du sie auch in dem ActionListener vwerwenden - oder aber du legst im ActionListener ein neues Profiloptionen Objekt an.

Scha dir noch mal mein letztes Posting an.
 
Hi,

1. Mögl.: Als final deklarieren: Mache ich es so richtig?
Java:
 final Profiloptionen profiloptionen = new Profiloptionen();
  profiloptionen.setVisible(true); //Aufruf des Fensters

2. Neues Objekt erzeugen: Das würde zwar theretisch gehen, aber ich verstehe nicht, wieso mir beim erstellen des neuen Objekts dieser Fehler angezeigt wird:


Der Fehler steht bei beiden Varianten da.
 
Das im ersten Post beschriebene Problem mit der Inner Class stammt nicht aus der Klasse Mühle, sondern aus Profiloptionen und findet sich in Zeile 311 (siehe Code aus erstem Post). Diesen Fehler konnte ich umgehen, indem ich einfach dank deinem Tipp ein neues Objekt angelegt habe:

[JAVA=308]
neuesSpiel.addActionListener(new ActionListener (){
public void actionPerformed (ActionEvent e){

Muehle muehle = new Muehle();
muehle.neuesSpielAnlegen(); //muehle.neues....?
setVisible(false); //Fenster schließen
// neues Spiel beginnen
}

});
[/code]
Hier klappt das mit dem Objekterstellen also; in der anderen Klasse hingegeben partout nicht. Dankeschön, dass du mir hilfst!
 
Es hat nun mittlerweile geklappt, nachdem ich die richtigen Parameter beim Aufruf mitangegeben habe. So sieht's in meinem Fall dann aus:
Java:
Profiloptionen profiloptionen = new Profiloptionen( Muehle.this,  highscore, 
profiloptionen.setVisible(true);

Nochmals Danke für eure Bemühungen!
 

Zurück
Oben