Speichern von Checkbox einträgen

Ratzefummel

Mitglied
Halli Hallo!

Und zwar habe ich ein paar CheckBoxen, dessen Wert (IsSelected oder IsDeselected) ich gerne dauerhaft speichern würde. Leider habe ich nicht mal einen kleinen Ansatz, wie ich das bewerkstelligen könnte.

hier erstmal einpaar code-fetzen:

Hier ist es so, dass jeder checkbox ein gewisser wert(9,11,10) übergeben wird.

Java:
if (e.getStateChange() == e.SELECTED){
	

			if (e.getItem() == info)
			{
			setCreditPoints(9);
			punkteStand = punkteStand + getCreditPoints();
			points.setText("Sie haben  " + getPunkteStand()  + " Creditpoints");
			}
		
			if (e.getItem() == info2 )
			{
				setCreditPoints(11);
				punkteStand = punkteStand + getCreditPoints();
				points.setText("Sie haben  " + getPunkteStand() + " Creditpoints");
				}
		
			if (e.getItem() == info3)
			{
				setCreditPoints(10);
				punkteStand = punkteStand + getCreditPoints();
				points.setText("Sie haben  " + getPunkteStand()  + " Creditpoints");
				}

Und hier wird er nun wieder abgezogen:
Java:
if (e.getStateChange() == e.DESELECTED){
	
	if (e.getItem() == info){
		setCreditPoints(9);
		punkteStand = punkteStand - getCreditPoints();
		points.setText("Sie haben" + getPunkteStand() + "Creditpoints");
	}
	
	if (e.getItem() == info2){
		setCreditPoints(11);
		punkteStand = punkteStand - getCreditPoints();
		points.setText("Sie haben" + getPunkteStand() + "Creditpoints");
	}
	
	if (e.getItem() == info3){
		setCreditPoints(10);
		punkteStand = punkteStand - getCreditPoints();
		points.setText("Sie haben" + getPunkteStand() + "Creditpoints");
	}

Das Endziel soll nun sein, dass wenn ich beispielsweise Info und info 3 ausgewählt habe bei neustart des Programms genauso erhalten bleiben und angezeigt werden soll.

An dieser Stelle auch noch mal ein Danke an Kaoz für seine Hilfe.:applaus:
 
Da hilft eine Datei mit genauso vielen Bits, wie Checkboxen. Eine null bedeutet nicht ausgewählt und eine eins das Gegenteil.
 
Gern geschehen, ich glaube dazu solltest du dich mal in Serialisierung einlesen, damit kannst du z.B zustände eines Objektes speichern(Serialisieren) und wieder einlesen(deserialisieren). Dies wird vorwiegend genutzt insofern du die Daten nur in deinem Programm nutzt, bzw. in Java.

Damit lässt es sich z.B auch realisieren Objekte über das Internet oder ein Netzwerk an eine andere stelle zu übermitteln und dort einfach mit dem gespeicherten Zustand wiederherzustellen.

Grundsätzlich dient Serialisierung dazu Objektzustände kurzzeitig zu speichern und bei dedarf wiederherzustellen . z.B bei Spielen den Spielstand.

So kannst du die Daten dann serialisiert in einer Datei mit der Dateiendung .sav oder auch .ser speichern

Alternative dazu ist :

Falls du es einfacher haben möchtest könntest du auch einfach wie Gucky schon beschrieben hat einfach einfach eine Datei erstellen die dann für eine ausgewählte Checkbox eine 1 in die Datei schreib und für jede nicht ausggewählte checkbox eine 0.

Dies kannst du mit einem einfachen FileWriter(BufferedWriter) bewerkstelligen.

so kannst du bei der Auswertung die Daten dann einfach so wieder aus der Textdatei einlesen :

Bsp.: Checkboxen.txt

Java:
0  // Checkbox 1 = nicht ausgewählt
1  // Checkbox 2 = ausgewählt
1  // Checkbox 3 = ausgewählt
0  // Checkbox 4 = nicht ausgwählt

usw...
 
Zuletzt bearbeitet:
Hallo,

erstmal vielen Dank, für eure Antworten.
Ok, also verstehe es jetzt folgendermaßen: Ich schreibe also ein FileWriter, der mir die Zustände der Checkboxen in ein Textdokument speichert zum beispiel, wenn ich auf einen button klicke. Und wenn ich dann auf laden gehe liest er die Zustände aus der Textdatei heraus und setzt dann die jeweiligen Checkboxen.
Ich hab ein wenig rumprobiert, aber da kommt bei mir nur müll heraus. Ich habe zum beispiel keine Ahnung, wie ich den Status der Checkboxen, also speziell in meinem Programmbeispiel in ein Texdokument speichern soll um diese dann auch noch auslesen zu können. ???:L
muss ich dafür jede einzelne Checkbox abfragen? wenn ja, wie sieht sowas in etwa aus? Finde kaum beispiele.
 
Du kannst es so machen:
Zuerst brauchst du eine Methode welche die Wert der JCheckBox- Instanzen speichert:
z.B. sowas:
Java:
    private void saveCheckBoxState() throws FileNotFoundException {
    	boolean checkBoxState[] = new boolean[4]; 
    	checkBoxState[0] = checkBox 1.isSelected();
    	checkBoxState[1] = checkBox2.isSelected();
    	checkBoxState[2] = checkBox3.isSelected();
    	checkBoxState[3] = checkBox4.isSelected();
    		
    	StringBuilder sb = new StringBuilder();
    	
    	for (int i = 0; i < rbStatus.length; i++) {
			sb.append("CheckBox" + (i + 1)  + ","+ checkBoxState[i] + "\n");
		}
    	
    	PrintStream out = null;
    	try {
    	    out = new PrintStream(new FileOutputStream("Pfad\\zur\\Datei\\in\\welcher\\der\\Status\\gelesen\\wird.txt"));
    	    out.print(sb.toString());
    	}
    	finally {
    	    if (out != null) out.close();
    	}
    }

Diese Methode rufst du auf, kurz bevor das Programm geschlossen wird. z.B in einem ActionListener von einem Exit Button:
Java:
        exit = new JButton();
        exit.setText("EXIT");
        
        exit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					saveCheckBoxState();
					System.exit(0);
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				}
			}
		});
Zum Laden der Werte aus der Datei muss nun eine weitere Methode erstellt werden:
Java:
    private boolean[] readCheckBoxState() {
    	boolean checkBoxState[] = new boolean[4];
    	  try{

    		  // Get the object of DataInputStream
    		  DataInputStream in = new DataInputStream(new FileInputStream("Pfad\\zur\\Datei\\in\\welcher\\der\\Status\\gelesen\\wird.txt"));
    		  BufferedReader br = new BufferedReader(new InputStreamReader(in));
    		  String strLine;
    		  int counter = 0;
    		  //Read File Line By Line
    		  while ((strLine = br.readLine()) != null)   {
    			  System.out.println (strLine);
    			  if(strLine.contains("true"))
    			 	checkBoxState[counter] = true;
    			  else
    				  checkBoxState[counter] = false;
    			  counter++;
    		  }
    		  in.close();
    		    }catch (Exception e){//Catch exception if any
    		  System.err.println("Error: " + e.getMessage());
    		  }
    	
    	return checkBoxState;
    }

Die Methode wird aufgerufen, bevor das JFrame dargestellt wird. z.B. im Konstruktor oder in einer init- Methode, welche das JFrame erstellt:
Java:
public SoftwareGUI(Controller controller){
        //Erstellt das Software-Fenster
        JFrame software = new JFrame("Test");
        software.setSize(500, 500);     // Fenster wird automatisch maximiert
        software.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        boolean checkBoxState[] = readCheckBoxState();
Die Werte werden in der Methode readCheckBoxState() eingelesen und in ein boolean- Array gespeichert. Nun werden die JCheckBox- Instanzen mit den boolean- Werte erstellt:
Java:
checkBox1= new JCheckBox("CheckBox 1", checkBoxState[0]);
checkBox2= new JCheckBox("CheckBox 2", checkBoxState[1]);
checkBox3= new JCheckBox("CheckBox 3", checkBoxState[2]);
checkBox4= new JCheckBox("CheckBox 4", checkBoxState[3]);

Thats it.
ist nicht gerade sehr übersichtlich und nicht ganz sicher, aber für den Anfang reicht dies sicher.

Je nachdem wie viel JCheckBox- Instanzen du hast, muss das boolean- Array grösser oder kleiner sein. (achete aber darauf, dass der index im Array immer mit 0 beginnt)

Besser wäre natürlich die Variante das ganze zu serialisieren, aber das ist ein anderes Thema.

Gruss knilch
 
Zuletzt bearbeitet:
Hallo!

erstmal vielen Dank, für eure Hilfe. Bin erst gestern dazu gekommen das ganze mal auszuprobieren.
Leider funktioniert es nicht wirklich.
Hier erstmal der Code, wie ich ihn implementiert habe:
Java:
public void speichern() throws FileNotFoundException {
	
	boolean checkbox [] = new boolean [26];
	
	checkbox [0] = info.isSelected();
	checkbox [1] = info2.isSelected();
	checkbox [2] = info3.isSelected();
	checkbox [3] = mathe.isSelected();
	checkbox [4] = mathe2.isSelected();
	checkbox [5] = mathe3.isSelected();
	checkbox [6] = design.isSelected();
	checkbox [7] = design2.isSelected();
	checkbox [8] = design3.isSelected();
	checkbox [9] = steuerung.isSelected();
	checkbox [10] = steuerung2.isSelected();
	checkbox [11] = steuerung3.isSelected();
	checkbox [12] = cad.isSelected();
	checkbox [13] = cad2.isSelected();
	checkbox [14] = visualcomputing.isSelected();
	checkbox [15] = visualcomputing2.isSelected();
	checkbox [16] = ergonomie.isSelected();
	checkbox [17] = praxissemester.isSelected();
	checkbox [18] = bachelorarbeit.isSelected();
	checkbox [19] = projektarbeit.isSelected();
	checkbox [20] = innovationen.isSelected();
	checkbox [21] = studienschwerpunkt.isSelected();
	checkbox [22] = studienschwerpunkt2.isSelected();
	checkbox [23] = experiencedesign.isSelected();
	checkbox [24] = designmanagement.isSelected();
	checkbox [25] = studienschwerpunkt3.isSelected();

	StringBuilder sb = new StringBuilder();
	
	for ( int i = 0; i < sb.length(); i++){
		
		sb.append("CheckBox" + (i+1) + checkbox [i] + "\n");
		
	}
	
	
	PrintStream out = null;
	
	try{
	out = new PrintStream (new FileOutputStream("cpspeicher.txt"));
	out.print(sb.toString());
}

finally {
	
	if (out != null) 
		out.close();
}
}

Müsste es hier nicht so sein, dass wenn die Methode ausgeführt wird direkt in die Textdatei geschrieben wird? Bei mir passiert da garnichts. Die speichern Methode wird hier ausgeführt:
Java:
public void actionPerformed(ActionEvent arg0) {
			CardLayout cl = (CardLayout) panelcontainer.getLayout();
			c15.show(panelcontainer, "9");
			try {
				speichern();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

Bin mir nicht sicher, ob er überhaupt auf die Textdatei zugreifen kann. Habe sie in dem Projektordner im erstellt. Eigentlich müsste das doch klappen oder?

Hier dann noch die laden-methode:
Java:
private boolean[] leseCheckBox(){
	
	boolean checkbox [] = new boolean [26];
	try{
		
		DataInputStream in = new DataInputStream(new FileInputStream("cpspeicher.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		String line ;
		int counter = 0;
		
		while ((line = br.readLine()) != null) 
		{
			System.out.println(line);
		if (line.contains("true"))
				checkbox[counter] = true;
				
				else
					checkbox[counter] = false;
				counter++;
	}
	in.close();
}catch (Exception e){
	
    System.err.println("Error: " + e.getMessage());
}
	return checkbox;
    
	
}

Diese rufe ich dann hier auf:

Java:
public void createWidgets() {
pnlnorth = new JPanel ();
	pnlnorth.setOpaque(false);
	
	boolean checkbox[] = leseCheckBox();
	
	cprechner = ImageIO.read(getClass().getResourceAsStream("cprechner.jpg"));
	backgroundpanel = new BackgroundPanel(cprechner);

Ausserdem wäre es noch ganz cool, wenn mir jemand nocheinmal genau erklärt, was hier passiert, weil ich mir über einige sachen nicht ganz im klaren bin.

Aber wie oben schon geschrieben, denke ich, dass das Programm auf die eigentliche txt. Datei nicht zugreifen kann. Hab´s schon ander probiert, indem ich die datei auf dem desktop ablege. aber da bekomme ich egal wie ich den Pfad angebe ständig eine FileNotFound Exception.

Vielen Dank schonmal!
 
FileNotFound Exception

Du musst den kompletten Pfad von der Datei "cpspeicher.txt" und "cprechner.jpg" angegeben.
z.B. "C:\\USER\\Desktop\\test\\cprechner.txt"
Und zwar überall dort, wo du auf die Datei zugreifen willst. (Beim Speichern und beim Lesen der Datei).

Ausserdem wäre es noch ganz cool, wenn mir jemand nocheinmal genau erklärt, was hier passiert, weil ich mir über einige sachen nicht ganz im klaren bin.
Was ist dir denn noch nicht so klar?
 
Zuletzt bearbeitet:
Also das mit dem Pfad müsste abe doch auch so funktionieren ohne den kompletten anzugeben. Bei dem jpg. klappt es ja auch. Gestern habe ich es unter anderem so probiert, wie du es beschrieben hast und habe merkwürdigerweise trotzdem eine exception bekommen.

Naja zu 100% klar sind mir folgende sachen nicht:

Java:
for ( int i = 0; i < sb.length(); i++){
		
		sb.append("CheckBox" + (i+1) + checkbox [i] + "\n");
		
	}
	
	
	PrintStream out = null;
	
	try{
	out = new PrintStream (new FileOutputStream("cpspeicher.txt"));
	out.print(sb.toString());
}

finally {
	
	if (out != null) 
		out.close();
}
}

Klar, wird hier für jeden index gespeichert, ob dieser ausgewählt ist. nur kann ich das schwer nachvollziehen. bzw. würde ich selber nicht drauf kommen es so zu machen. Kann mir da jemand vielleicht kommentare zu den einzelnen schritten machen?
 
Hi,

In deinem Code hat sich ein Fehler eingeschlichen...
folgender Code wird nie ausgeführt:
Java:
for ( int i = 0; i < sb.length(); i++){ 
        sb.append("CheckBox" + (i+1) + checkbox [i] + "\n");
}
Grund:
die Abbrechbedingung für den For- Loop ist bei dir sb.length(). Die Länge ist am Anfang immer 0.
Du musst über die Länge des boolean- Array iterieren:

Java:
for (int i = 0; i < checkbox.length; i++) {
        sb.append("CheckBox" + (i+1) + checkbox [i] + "\n");
}

Hier passiert nun folgendes:
Im For-loop wird über das boolean- Array iteriert. Der StringBuilder ist ähnlich wie eine String- Variable, aber weitaus performater wenn Strings zusammengesetzt werden.
Für jeden Eintrag im boolean- Array wird nun eine Zeile erstellt:
"CheckBox" + (i+1) + checkbox + "\n"
Diese Zeile wird in der Stringbuilder- Instanz hinzugefügt (mit der append- Methode)
Sobald alle Felder vom boolean- Array ausgelesen wurden, wird in folgenden Zeilen der Inhalt der StringBuilder- Instanz gespeichert.

PrintStream out = null;
out = new PrintStream (new FileOutputStream("cpspeicher.txt"));
out.print(sb.toString());

Du schreibst, dass beim jpg keine Exception geworfen wird.
Wenn du möchtest, kannst du mir mal den ganzen Code schicken. Vielleicht finde ich heraus wo das Problem liegen könnte.
 
Zuletzt bearbeitet:
Moin!

ok, also soweit hab ich das verstanden, was du erklärt hast. Jetzt funktioniert auch alles perfekt.
Habe jetzt aber noch ein weiteres Problem. und zwar werden zu jeder checkbox auch ein fester wert übergeben, abgespeichert und zur nächsten ausgewählten checkbox addiert bzw. nicht ausgewählter checkbox subtrahiert. Der gespeicherte Wert wird dann jedesmal ausgegeben:

Java:
if (e.getStateChange() == e.SELECTED){
	

			if (e.getItem() == info)
			{
			setCreditPoints(9);
			punkteStand = punkteStand + getCreditPoints();
			points.setText("Sie haben  " + getPunkteStand()  + " Creditpoints");// genau das sollte dann auch noch geladen werden können
			}
		
			if (e.getItem() == info2 )
			{
				setCreditPoints(11);
				punkteStand = punkteStand + getCreditPoints();
				points.setText("Sie haben  " + getPunkteStand() + " Creditpoints");
}

"Punktestand" soll jetzt natürlich auch noch gespeichert und geladen werden. Das speichern war soweit kein Problem. Hab dafür einfach eine neue Textdatei erstellt:
Java:
out = new PrintStream (new FileOutputStream("cpspeicher2.txt"));
	out.print(getPunkteStand());

Das laden von Punktestand bereitet mir aber nun Kopfzerbrechen. Ich denke, dass dieser ansatz völliger schrott ist????:L
Java:
private boolean[] leseCheckBox(){
	
	boolean checkbox [] = new boolean [26];
	try{
		
		DataInputStream in = new DataInputStream(new FileInputStream("cpspeicher.txt"));
		DataInputStream in2 = new DataInputStream(new FileInputStream("cpspeicher2.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
		String line ;
		int counter = 0;
		
		while ((line = br.readLine()) != null) 
		{
			System.out.println(line);
		if (line.contains("true"))
				checkbox[counter] = true;
				
				else
					checkbox[counter] = false;
				counter++;
	}
	in.close();
}catch (Exception e){
	
    System.err.println("Error: " + e.getMessage());
}
	return checkbox;
    
	
}

Ich hoffe du erkennst was ich meine und kannst mir kurz helfen. Wäre auch cool, wenn du mir diese methode etwas näher erläutern könntest.

Achja, es klappt tatsächlich auch ohne den kompletten pfad anzugeben. Sobald die datei im Projekt ordner abgelegt ist, findet er sie auch so.
 
Zuletzt bearbeitet:
Hallo,
gut das mit dem CheckBox status hat mal geklappt.
Nun zum Laden vom Punktestand.

Du must dazu eine neue Methode erstellen.
Diese Methode sieht ähnlich aus wie leseCheckBox() gibt aber einen int zurück.
Poste doch mal, wie das Format der Datei: cpspeicher2.txt aussieht. Dies ist wichtig um die Methode zum Lesen genauer zu erstellen.
z.B:
Java:
	public int lesePunkteStand(){
		int punktestand = 0;
		try{
			DataInputStream in = new DataInputStream(new FileInputStream("cpspeicher2.txt"));
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			String line ;

			while ((line = br.readLine()) != null) {
				punktestand = Integer.parseInt(line); 
/* hier wird versucht, die Zahl, welche als String gelesen wird, als integer zu parsen. Diese kann aber eine Exception auslösen, wenn ein String in der Zeile auftauch. 
Je nachdem wie du den Punktestand in die Datei speicherst, muss dieser Loop geändert werden.
*/
			}
			in.close();
		}
		catch (Exception e){
			System.err.println("Error: " + e.getMessage());
		}
		return punktestand;
				
	}
 
Also checkbox2 wird ganz normal abgespeichert. einfach eine textdatei mit einer zahl drin. Meinst du das?
Habs auf jeden fall selbst probiert und es klappt natürlich nicht. :noe:

Java:
public int lesePunkteStand(){
	
	int punktestand = 0 ;
	
	try{
	
	DataInputStream in = new DataInputStream(new FileInputStream("cprechner2.txt"));
	BufferedReader br = new BufferedReader(new InputStreamReader(in));
	String line;
	
	while((line = br.readLine()) != null) {
		punktestand = Integer.parseInt(line);
	}
	
	in.close();
	}
	catch (Exception e) {
		System.err.println("Error");
	}
	return punktestand;
	
	
	
}

und hier versuche ich das ganze aufzurufen:
Java:
public Creditpointrechner  (CardLayout c15,JPanel panelcontainer) {
	
	this.c15 = c15;
	this.panelcontainer = panelcontainer;
	createWidgets();
	layoutWidgets();
	setPunkteStand(0);
	points.setText(" Sie haben" + lesePunkteStand());
}

Eigentlich möchte ich ja nur, dass die zahl jetzt am bei points ausgegeben wird und das programm dann mit diesem wert weiterarbeitet.
 
Oh Man! Hab anstatt cpspeicher.txt, cprechner,txt angegeben.:lol: Hat sich also erledigt. Das Programm läuft nun perfekt!!!:applaus:
Vielen Dank nochmal. Du hast mir sehr geholfen und mir eine Menge Zeit erspart. Aber das beste ist, dass ich so auch alles gelernt und verstanden habe....

Nun habe ich auch noch eine andere sache wofür ich aber ein neues Thema erstellen werde. Kennst du dich zufällig mit Drag and Drop aus in Java?
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben