Checkbox-zustände in einem JFrame speichern

Chloroplast

Bekanntes Mitglied
Ich habe folgendes Problem: für ein programm brauch ich ein fenster das Checkboxes enthält und dären zustände speichert dafür hab ich 5 klassen 1. die hauptklasse die die anderen aufruft, 2. das 1.frame mit dem man 3. das configurations frame aufruft 4. die Daten-klasse wo die daten, die gespeichert werden, sind und 5. den WindowsClosingAdapter die Quellcodes:

Java:
import java.awt.*;

import java.io.*;
 
public class haupt {
	Daten dat;
    
    //Konstruktor
    public void haupt(){       	
    }
    //Startmethode
    public static void main(String[] args) {
    	haupt ds = new haupt();
    	ChatFrame f = new ChatFrame(ds);
    	//ds.speichern(); 
       	ds.laden();
       	if(ds.dat==null)ds.dat = new Daten();
    }
    
    public void settings(){
    	haupt ds = new haupt();
    	settings se = new settings(ds); 
}
   	public void speichern(){
		try{
			System.out.println("speichern!");
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Speicher.dat"));
			ObjectOutputStream os = new ObjectOutputStream(out);
			os.writeObject(dat);
	  		os.close();
			} catch (IOException e) {
		      System.err.println(e.toString());
		    }		    
	}
	
	public void laden(){
		System.out.println("laden!");
		try {
		  ObjectInputStream is = new ObjectInputStream(new FileInputStream("Speicher.dat"));
	      dat = (Daten) is.readObject();
	      is.close();
	    } catch (ClassNotFoundException e) {
	      System.err.println(e.toString());
	    } catch (IOException e) {
	      System.err.println(e.toString());
	    }
	}
}

Java:
import java.awt.*;
import java.awt.event.*; 
import javax.swing.JPasswordField;


public class ChatFrame extends Frame implements ActionListener {

	haupt dsp;
	TextField tf;
	JPasswordField passwortFeld;
	String code="feueralarm";
	String codea;
	boolean sperre;
	
	//Konstruktor
    public ChatFrame(haupt d) {
    	super("programm beender beenden");
		dsp=d;
		
		
    	//addWindowListener(new WindowClosingAdapter(true));
    	setLocation(600,10);
    	//Größe setzen(X,Y)
    	setSize(500,500);
    	
    	passwortFeld = new JPasswordField();
    	passwortFeld.setText("");
    	passwortFeld.setEchoChar('?');
    	add("South",passwortFeld); 
    		
    	tf = new TextField("Code zum deacktivieren des killing-prozesses",40);
    	tf.addActionListener(this);
    	passwortFeld.addActionListener(this);
		//add("South",tf); 
    	
    	//Sichtbar machen
    	setVisible(true);
    	//Das StandardLayout im Frame ist BorderLayout!
  
		
		add("North",new Label("Die Programme Firefox, InternetExplorer, Minecraft und der Taskmanager werden vorübergehend gesperrt"));
		//add("West",new Label("wo der soeben gewählte punkt higesetzt werden soll."));
		//Zeigt den Frame           ( f.hide()versteckt ihn wieder! )
		show();
    	
	}
	
  public void actionPerformed(ActionEvent event){
   Object obj = event.getSource();

   //	if (obj.equals(passwortFeld)){
   		System.out.println("step1");
   		//Abfrage des Textes
   		codea=event.getActionCommand();
   		codea=passwortFeld.getText();
   		if(codea.equals(code)){
   			System.out.println("aus");
   			addWindowListener(new WindowClosingAdapter(true));
   			sperre=true;
   			repaint();
   			setBackground(Color.green);}
   			else{
   				setBackground(Color.red);}
   				
   			
   	//}
  
  if(sperre==true){
  
  if(codea.equals("settings")){
   			dsp.settings();}}
   

   	
  if(sperre==true){
  
  if(codea.equals("stop")){
   			System.exit(0);}}
  } 
  
    
  
    public void paint(Graphics g){
    	
    	
	}
    
}


Java:
import java.awt.*;
import java.awt.event.*; 
import javax.swing.*;


public class settings extends JFrame implements ActionListener,ItemListener {

	haupt dsp;
	JButton exit,save;
	Checkbox MF,IE,TM,MC;
	boolean ItemActivate[]=new boolean [5];
	
	

	
	//Konstruktor
    public settings(OnePCChat d) {
    	super("settings");
    	
    	umform();
    	
    	setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
    	
    	GridLayout G = new GridLayout(6,1);
    	setLayout(G);
    	//setLayout(new FlowLayout()); 
    	
    	
    	exit = new JButton( "Schließen" );	
    	exit.addActionListener(this);
    	save = new JButton( "Speichern" );	
    	save.addActionListener(this);
    	
    	MF = new Checkbox ("Mozilla Firefo",ItemActivate[0]);
    	IE = new Checkbox ("Internet Explorer",ItemActivate[1]);
    	MC = new Checkbox ("Minecraft",ItemActivate[2]);
    	TM = new Checkbox ("Task Manager",ItemActivate[3]);
    	
    	add(MF);
    	add(IE);
    	add(MC);
    	add(TM);
    	add(save);
    	add(exit);	
    		
		dsp=d;
		
		

    	setLocation(600,10);
    	//Größe setzen(X,Y)
    	setSize(500,500);
    	
    	
    		


    	    	//Sichtbar machen
    	setVisible(true);

		show();
    	
	}
	
	public void umform(){
		for(int cc=0;cc<5;cc++){
			if(dsp.dat.ItemActivate[cc]=="enable"){ItemActivate[cc]=true;
		}
		else{ItemActivate[cc]=false;
		}
		}
	}
	
	public void itemStateChanged(ItemEvent arg0) {
		}
	
  public void actionPerformed(ActionEvent e){
   Object obj = e.getSource();
   		System.out.println("step1");
   		if(e.getSource()==exit)hide(); 
   		if(e.getSource()==save)dsp.speichern(); 
   		//Abfrage des Textes

   		
   		
} 

   	
   
  
    
  
    public void paint(Graphics g){
    	
    	
	}
    
}


Java:
import java.io.*;

public class Daten implements Serializable  {
	String ItemActivate[] = new String[50];


	   
		
	public void Daten(){
	} 	
}


Java:
/**
 * @(#)WindowClosingAdapter.java
 *
 *
 * @author 
 * @version 1.00 2010/4/15
 */


import java.awt.*;
import java.awt.event.*;

public class WindowClosingAdapter extends WindowAdapter {
	//bei true wird das System beendet
	private boolean exitSystem;
	
	//Konstuktor der auch aufgerufen wird!
	public WindowClosingAdapter (boolean exitSystem){
		//System.out.println("Konstruktor mit Parameter");
		this.exitSystem = exitSystem;
	}
	//Konstruktor 
	public WindowClosingAdapter(){
		this(false);
		//System.out.println("Konstruktor");
	}

	public void windowClosing(WindowEvent event ){
		System.out.println("windowClosing");
		event.getWindow().setVisible(false);
		event.getWindow().dispose();
		if(exitSystem){
			System.exit(0);
		}		
	}
}

das ist der fehlercode:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at settings.umform(settings.java:68)
at settings.<init>(settings.java:21)
at OnePCChat.settings(OnePCChat.java:22)
at ChatFrame.actionPerformed(ChatFrame.java:72)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1633)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
at java.awt.Component.processEvent(Component.java:6040)
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.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
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)

hoffe mir kann jemand helfen.
 
Na ja, der Fehler wird dir doch hier schon genannt und auch gezeigt, wo er auftritt:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at settings.umform(settings.java:68)

Da stimmt die Zeilennummerierung hier im Forum und bei dir in der IDE wohl nicht überein. Aber dort in Zeile 68 ist ein Objekt null, also wahrscheinlich noch nicht erstellt, auf das du zugreifen möchtest.

EDIT: Und zwar ist es dsp, weil du zuerst umform() aufrufst und danach erst dsp=d zuweist...

EDIT 2: Ausserdem werden Klassennamen gross geschrieben, also Settings anstatt settings. Und in der Klasse Daten gehört das void beim Konstruktor weg.
 
Zuletzt bearbeitet von einem Moderator:
Also so:
Java:
import java.awt.*;

import java.io.*;
 
public class OnePCChat {
	Daten dat;
    
    //Konstruktor
    public void OnePCChat(){       	
    }
    //Startmethode
    public static void main(String[] args) {
    	OnePCChat ds = new OnePCChat();
    	ChatFrame f = new ChatFrame(ds);
    	//ds.speichern(); 
       	ds.laden();
       	if(ds.dat==null)ds.dat = new Daten();
    }
    
    public void settings(){
    	OnePCChat ds = new OnePCChat();
    	Settings se = new Settings(ds); 
}
   	public void speichern(){
		try{
			System.out.println("speichern!");
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Speicher.dat"));
			ObjectOutputStream os = new ObjectOutputStream(out);
			os.writeObject(dat);
	  		os.close();
			} catch (IOException e) {
		      System.err.println(e.toString());
		    }		    
	}
	
	public void laden(){
		System.out.println("laden!");
		try {
		  ObjectInputStream is = new ObjectInputStream(new FileInputStream("Speicher.dat"));
	      dat = (Daten) is.readObject();
	      is.close();
	    } catch (ClassNotFoundException e) {
	      System.err.println(e.toString());
	    } catch (IOException e) {
	      System.err.println(e.toString());
	    }
	}
}

Java:
import java.awt.*;
import java.awt.event.*; 
import javax.swing.JPasswordField;


public class ChatFrame extends Frame implements ActionListener {

	OnePCChat dsp;
	TextField tf;
	JPasswordField passwortFeld;
	String code="feueralarm";
	String codea;
	boolean sperre;
	
	//Konstruktor
    public ChatFrame(OnePCChat d) {
    	super("programm beender beenden");
		dsp=d;
		
		
    	//addWindowListener(new WindowClosingAdapter(true));
    	setLocation(600,10);
    	//Größe setzen(X,Y)
    	setSize(500,500);
    	
    	passwortFeld = new JPasswordField();
    	passwortFeld.setText("");
    	passwortFeld.setEchoChar('?');
    	add("South",passwortFeld); 
    		
    	tf = new TextField("Code zum deacktivieren des killing-prozesses",40);
    	tf.addActionListener(this);
    	passwortFeld.addActionListener(this);
		//add("South",tf); 
    	
    	//Sichtbar machen
    	setVisible(true);
    	//Das StandardLayout im Frame ist BorderLayout!
  
		
		add("North",new Label("Die Programme Firefox, InternetExplorer, Minecraft und der Taskmanager werden vorübergehend gesperrt"));
		//add("West",new Label("wo der soeben gewählte punkt higesetzt werden soll."));
		//Zeigt den Frame           ( f.hide()versteckt ihn wieder! )
		show();
    	
	}
	
  public void actionPerformed(ActionEvent event){
   Object obj = event.getSource();

   //	if (obj.equals(passwortFeld)){
   		System.out.println("step1");
   		//Abfrage des Textes
   		codea=event.getActionCommand();
   		codea=passwortFeld.getText();
   		if(codea.equals(code)){
   			System.out.println("aus");
   			addWindowListener(new WindowClosingAdapter(true));
   			sperre=true;
   			repaint();
   			setBackground(Color.green);}
   			else{
   				setBackground(Color.red);}
   				
   			
   	//}
  
  if(sperre==true){
  
  if(codea.equals("settings")){
   			dsp.settings();}}
   

   	
  if(sperre==true){
  
  if(codea.equals("stop")){
   			System.exit(0);}}
  } 
  
    
  
    public void paint(Graphics g){
    	
    	
	}
    
}


Java:
import java.awt.*;
import java.awt.event.*; 
import javax.swing.*;


public class Settings extends JFrame implements ActionListener,ItemListener {

	OnePCChat dsp;
	JButton exit,save;
	Checkbox MF,IE,TM,MC;
	boolean ItemActivate[]=new boolean [5];
	
	

	
	//Konstruktor
    public Settings(OnePCChat d) {
    	super("settings");
    	
    	
    	
    	
    	setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
    	
    	dsp=d;
    	umform();
    	
    	GridLayout G = new GridLayout(6,1);
    	setLayout(G);
    	//setLayout(new FlowLayout()); 
    	
    	
    	exit = new JButton( "Schließen" );	
    	exit.addActionListener(this);
    	save = new JButton( "Speichern" );	
    	save.addActionListener(this);
    	
    	MF = new Checkbox ("Mozilla Firefo",ItemActivate[0]);
    	IE = new Checkbox ("Internet Explorer",ItemActivate[1]);
    	MC = new Checkbox ("Minecraft",ItemActivate[2]);
    	TM = new Checkbox ("Task Manager",ItemActivate[3]);
    	
    	add(MF);
    	add(IE);
    	add(MC);
    	add(TM);
    	add(save);
    	add(exit);	
    		
		
		
		

    	setLocation(600,10);
    	//Größe setzen(X,Y)
    	setSize(500,500);
    	
    	
    		


    	    	//Sichtbar machen
    	setVisible(true);

		show();
    	
	}
	
	public void umform(){
		for(int cc=0;cc<5;cc++){
			if(dsp.dat.ItemActivate[cc]=="enable"){ItemActivate[cc]=true;
		}
		else{ItemActivate[cc]=false;
		}
		}
	}
	
	public void itemStateChanged(ItemEvent arg0) {
		}
	
  public void actionPerformed(ActionEvent e){
   Object obj = e.getSource();
   		System.out.println("step1");
   		if(e.getSource()==exit)hide(); 
   		if(e.getSource()==save)dsp.speichern(); 
   		//Abfrage des Textes

   		
   		
} 

   	
   
  
    
  
    public void paint(Graphics g){
    	
    	
	}
    
}

Java:
import java.io.*;

public class Daten implements Serializable  {
	String ItemActivate[] = new String[50];


	   
		
	public Daten(){
	} 	
}

Java:
/**
 * @(#)WindowClosingAdapter.java
 *
 *
 * @author 
 * @version 1.00 2010/4/15
 */


import java.awt.*;
import java.awt.event.*;

public class WindowClosingAdapter extends WindowAdapter {
	//bei true wird das System beendet
	private boolean exitSystem;
	
	//Konstuktor der auch aufgerufen wird!
	public WindowClosingAdapter (boolean exitSystem){
		//System.out.println("Konstruktor mit Parameter");
		this.exitSystem = exitSystem;
	}
	//Konstruktor 
	public WindowClosingAdapter(){
		this(false);
		//System.out.println("Konstruktor");
	}

	public void windowClosing(WindowEvent event ){
		System.out.println("windowClosing");
		event.getWindow().setVisible(false);
		event.getWindow().dispose();
		if(exitSystem){
			System.exit(0);
		}		
	}
}

ich bekomm aber immer noch dieselbe fehlermeldung wenn ich versuche das fenster zu öffnen

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Settings.umform(Settings.java:72)
at Settings.<init>(Settings.java:27)
at OnePCChat.settings(OnePCChat.java:23)
at ChatFrame.actionPerformed(ChatFrame.java:72)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1633)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
at java.awt.Component.processEvent(Component.java:6040)
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.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
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)
 
Na ja, du hast die Art des Fehlers (NullPointerException) und den genauen Ort, wo der Fehler auftritt (Settings.java:72). Schau doch einfach mal dort, welches Objekt NULL ist, z.B. durch Ausgabe auf der Konsole, und wo das herkommt bzw. warum das dann NULL ist. Vielleicht ist es ja auch dsp.dat.ItemActivate[cc]...

Bin eh ein bisschen verwirrt: einmal ist dsp.dat.ItemActivate[cc] ein String, und einmal ist ItemActivate[cc] boolean.

Ach ja, noch was (Klasse OnePCChat):

[JAVA=16]
ds.laden();
if(ds.dat==null)ds.dat = new Daten();
[/code]

Mit der Methode laden() holst du Daten aus einer Datei.
Java:
dat = (Daten) is.readObject();

In der Klasse Daten hast du einen leeren Konstruktor und ein String-Array, welches zwar initialisiert, aber nicht gefüllt wird. Auch nicht über die Methode laden(). Du musst dir mal genauer anschauen, wie Arrays angelegt und gefüllt werden. Vermutlich liegt es daran, dass du eine NullPointerException an der genannten Stelle bekommst.
 
Zuletzt bearbeitet von einem Moderator:
ich glaube ich habe das Problem gefunden: in der hauptmethode in zeile 17
[JAVA=17]if(ds.dat==null)ds.dat = new Daten();[/code]
wird wenn dat==null also leer ist dass irgentwie gefüllt. denn wenn ich dass in die methode settings reinkopiere geht alles. kann ich jetzt von der klasse Settings genauso auf die variablen zugreifen, oder ist dass irgentwie anders

Bin eh ein bisschen verwirrt: einmal ist dsp.dat.ItemActivate[cc] ein String, und einmal ist ItemActivate[cc] boolean.

dass liegt daran dass ich zuerst dachte dass es mit der boolean ein problem gibt und habe deshalb eine String-Variable daraus gemacht,die dann erst später in der for-schleife zu ner boolean umgewandelt wird
 
ich glaube ich habe das Problem gefunden: in der hauptmethode in zeile 17
[JAVA=17]if(ds.dat==null)ds.dat = new Daten();[/code]
wird wenn dat==null also leer ist dass irgentwie gefüllt.

Der Konstruktor in Daten ist leer, da wird garnichts gefüllt...
Code:
String ItemActivate[] = new String[50];
legt zwar einen String-Array an, aber da ist nichts drin.
 
aber soweit ich weiß wird wenn z.B. ein String oder ein Integer wert erstellt wird dieser gleich gefüllt (zwar mit nichts sprich beim String ="" oder beim Integer =0)dass ist aber nicht ==null:bahnhof:
 
aber soweit ich weiß ...

und das ist leider alles falsch!
Code:
Integer
, als auch
Code:
String
sind
Code:
Objekte
und der default-Wert bei Objekten ist NULL.

Es gibt primitive Datentypen wie
Code:
int
, die z.B mit 0 default mässig initialisiert sind.
siehe auch den folgenden Code mit Ausgabe:

Java:
public static void main(String[] args) {
		String[] string = new String[1];
		Integer[] integer = new Integer[1];
		int[] in = new int[1];

		for (int i = 0; i < string.length; i++) {
			System.out.println(string[i]);
			System.out.println(integer[i]);
			System.out.println(in[i]);
		}
	}
SQL:
null
null
0
 
Zuletzt bearbeitet:
Oh, naja, aus Fehlern kann man dann lernen. 😳 dann versteh ich jetzt aber nicht wieso ich trotzdem auf die variablen zugreifen kann. obwohl sie ==null sind...:noe:
 

Neue Themen


Zurück
Oben