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:
Ich vermute mal, ihr braucht auch den Quelltext von Profiloptionen, der ist halt etwas länger...
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 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....