JComboBox füllen ruft NullPointerException auf

Tinipieps

Mitglied
Hallo!
Bin grad dabei eine GUI zu erstellen, auf der eine JComboBox auftaucht.
Hab nach genau dem gleichen Prinzip an anderer Stelle schon erfolgreich programmiert, aber folgender Code verursacht NullPointerException.
Findet jemand den Fehler?


Code:
#Absender.ini
#Konfigurationen der moeglichen Absenderadressen
#Diese Datei legt fest, welche Absenderadressen im Drop-Down-Menue angeboten werden

# Stepanski Tue Apr 20 2010

Person1@blabla.org
Person2@blabla.org
Code:
/**
 * 
 */
package adresses;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Properties;

import javax.swing.JComboBox;

import application.Application;

/**
 * Diese Klasse bietet alle Methoden, um die Konfigurationsdatei der 
 * moeglichen Absender auszulesen
 * @author Stepanski
 *
 */
public class Sender {
	
static JComboBox cb1;
	
	/**
	 * Diese Methode liest Schlüssel der Datei aus 
	 * und schreibt diese dann in ein String[]
	 * @return  String[]  senderArray
	 */
	public static String[ ] getSender() {
		
		//String[] anlegen
		String [ ] senderArray = null;
		//Konfigurationsdatei wird eingelesen
		InputStream is;
		try {
			is = new FileInputStream(new File(
					Application.path+"Absender.ini"));
			//Instanz der Properties-Klasse erzeugen 
			//->verwaltet Schlüssel/Wertepaare als Strings
			Properties prop = new Properties();
			//Instanz wird Datei übergeben
			prop.load(is);
			//StringArray anlegen, indem Schlüssel stehen
			senderArray = new String [prop.size()];
			prop.keySet().toArray(senderArray);
			//FileInputStream schließen
			is.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return senderArray ;
	}

	/*
	* Methoden, um Absender-Auswahl zu erstellen
	*/

	
	/**
	 *  Diese Methode fuellt die JComboBox, welche im Auswahl-Dialog 
	 *  eingebettet wird
	 */
	public static void fillAdressCombo(){
		
		String [] adressen = getSender();
		Arrays.sort(adressen);
		for (String i:adressen) {
			System.out.println(i);
			cb1.addItem(i);
		}
	}
}
Code:
package login;


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
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.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import adresses.Sender;
import client.Client;

/**
 * Diese Methode erzeugt ein LogIn-Fenster.
 * Bei Eingabe eines registrierten Nutzers mit dazugehörigem Passwort
 * wird das Hauptprogramm geöffnet.
 * @author Stepanski
 *
 */
public class LogIn extends JFrame{

	private static final long serialVersionUID = 1L;
	
	/*Attribute*/
	Container container;
	JPanel p;
	
	JLabel user;
	JComboBox cb1;
	
	JButton login;
	
	/*Konstruktor*/
	/**
	 * Diese Methode enthält einen Konstruktor, welcher ein 
	 * LogIn-Fenster erzeugt.
	 */
	public LogIn(){
		super();
		this.createLogIn();
		
		this.setName("LogIn");
		this.setSize(400, 200);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (d.width - getSize().width) / 2;
		int y = (d.height - getSize().height) / 2 ;
		setLocation(x, y);
		
		this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        this.setVisible(true);
        this.setResizable(false);
        this.pack();   		
	}

	/**
	 * Diese Methode legt das Aussehen des 
	 * Panels auf dem LogIn-Fenster fest.
	 */
	private void createLogIn() {
		
		Container cp = this.getContentPane();
		
		p = new JPanel();
		
		// GridBagLayout, um individuelles Aussehen zu ermöglichen
		GridBagLayout gbl = new GridBagLayout();
		p.setLayout(gbl);
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.gridheight = 1;
		c.gridwidth = 1;
		c.insets = new Insets(10,10,10,10);
		
		user = new JLabel("Benutzername: ");
		p.add(user, c);
		
		////////////////////////////////////////////////////////////
        // ComboBox mit Adressen aufrufen
		cb1 =new JComboBox();
		c.gridx=1;
		c.gridwidth=2;
		p.add(cb1, c);
				
        Sender.fillAdressCombo();
		
		// KeyListener ermoeglicht Bestaetigung des Passwortes mit 
		// der Taste "ENTER"
		cb1.addKeyListener(new KeyListener () {

			@Override
			public void keyPressed(KeyEvent e) {
				int key = e.getKeyCode();
				if ( key == KeyEvent.VK_ENTER){
								
					// Liste aller angelegten Nutzer
					String nutzer = (String) cb1.getSelectedItem();
					System.out.println(nutzer);
					
					// neues Hauptfenster oeffnen
					Client client = new Client();
					client.setAbsender(nutzer);
							
					// LogIn-Fenster "unsichtbar" machen
					LogIn.this.setVisible(false);
					// gibt Speicher wieder frei
					dispose();
				}else
						JOptionPane.showMessageDialog(null, 
							"Anmeldung fehlgeschlagen",
							"Error Message", JOptionPane.ERROR_MESSAGE);				
			}

			@Override
			public void keyReleased(KeyEvent arg0) {
				
			}

			@Override
			public void keyTyped(KeyEvent arg0) {
				
			}
			
		});	
		
		login = new JButton("ENTER");
		c.gridx = 3;
		c.gridy = 2;
		c.insets = new Insets(20,10,10,0);
		p.add(login, c);
		
		// gleiche Aktion wie bei KeyListener, nur das diesmal auf 
		// druecken des Buttons reagiert wird
		login.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent evt) {
				String nutzer = (String) cb1.getSelectedItem();
				System.out.println("Nutzer: "+nutzer);
					
				LogIn.this.setVisible(false);
				// gibt Speicher wieder frei
				dispose();
					
				Client client = new Client();
				client.setAbsender(nutzer);
			}
		});
			
		cp.add(p, BorderLayout.CENTER);
		
	}
}
Code:
package application;
import login.LogIn;

/**
 * Diese Klasse enthaelt die main-Mathode und startet die Applikation
 * @author Stepanski
 *
 */
public class Application {
	
	public static final String path = "D:\\E-Mail-Client\\";
	
	public static void main (String[] args){

		 new LogIn();
	
	}
}
 
Hi,
In der Sender Klasse hast du eine ComoboBox cb1, die nicht initialisiert ist. Und da ich in deiner Login-Klassed as auch nirgendwo sehe, schätze ich mal dass dies der Fehler ist.
Aber wie Kai schon sagt, das nächste mal gleich den StackTrace mitposten!

Grüße!
 
Java:
public static String[ ] getSender() {
		
		//String[] anlegen
		String [ ] senderArray = null;
		//Konfigurationsdatei wird eingelesen
		InputStream is;
		try {
			is = new FileInputStream(new File(
					Application.path+"Absender.ini"));
			//Instanz der Properties-Klasse erzeugen 
			//->verwaltet Schlüssel/Wertepaare als Strings
			Properties prop = new Properties();
			//Instanz wird Datei übergeben
			prop.load(is);
			//StringArray anlegen, indem Schlüssel stehen
			senderArray = new String [prop.size()];
			prop.keySet().toArray(senderArray);
			//FileInputStream schließen
			is.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return senderArray ;
	}

	/*
	* Methoden, um Absender-Auswahl zu erstellen
	*/

	
	/**
	 *  Diese Methode fuellt die JComboBox, welche im Auswahl-Dialog 
	 *  eingebettet wird
	 */
	public static void fillAdressCombo(){
		
		String [] adressen = getSender();
		Arrays.sort(adressen);
		for (String i:adressen) {
			System.out.println(i);
			cb1.addItem(i);
		}
	}

Wenn dein Programm in den catch-Block läuft, kann es passieren, dass dein Rückgabe-Array immernoch null ist, was in fillAdressCombo() schließlich zu Problemen führt.
 
Ihr hattet recht, ich hab aus irgendeinem Grund vergessen, die Variable cb1 zu initialisieren.
Habs gemacht und siehe da, die Exception tritt nicht mehr auf!
Danke für den Tipp.
Manchmal sitzt man echt vorm Bildschirm und sieht den Wald vor lauter Bäumen nicht!

Jetzt hab ich nur irgendwie das Problem, dass das sysout alle Einträge ausgibt, sie aber nicht in der JComboBox auftauchen!
Versteh ich nicht. In ner anderen GUI funktioniert es mit dem Quelltext.
 
Jetzt hab ich nur irgendwie das Problem, dass das sysout alle Einträge ausgibt, sie aber nicht in der JComboBox auftauchen!
Versteh ich nicht. In ner anderen GUI funktioniert es mit dem Quelltext.

Vielleicht bin ich blind aber ich vermute bei dir ist

Java:
public class Sender {
	
static JComboBox cb1;

ungleich

Java:
public class LogIn extends JFrame{

	//...

	JComboBox cb1;
 
Zurück