Speicherfunktion

Huhu Leute!

Ich habe mal eine Frage zu einem code den ich im internet gefunden habe.

Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
 
public class FileDialogDemo extends JFrame implements ActionListener{
  private JMenuItem jmiOpen;
  private JMenuItem jmiSave;
  private JMenuItem jmiExit;
  private JMenuItem jmiAbout;
  private JTextArea jta = new JTextArea();
  private JLabel jlblStatus = new JLabel();
  private JFileChooser jFileChooser = new JFileChooser();
   
  public static void main(String [] args){
    FileDialogDemo frame = new FileDialogDemo();
    frame.setLocation(100, 200);
    frame.setTitle("Test JFileChooser");
    frame.setSize(300,150);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
 
  public FileDialogDemo(){
    JMenuBar mb = new JMenuBar();
    setJMenuBar(mb);
 
    JMenu fileMenu = new JMenu("File");
    mb.add(fileMenu);
 
    JMenu helpMenu = new JMenu("Help");
    mb.add(helpMenu);
 
    fileMenu.add(jmiOpen = new JMenuItem("Open"));
    fileMenu.add(jmiSave = new JMenuItem("Save"));
    fileMenu.addSeparator();
    fileMenu.add(jmiExit = new JMenuItem("Exit"));
    helpMenu.add(jmiAbout = new JMenuItem("About"));
 
    jFileChooser.setCurrentDirectory(new File("."));
 
    getContentPane().add(new JScrollPane(jta), BorderLayout.CENTER);
    getContentPane().add(jlblStatus, BorderLayout.SOUTH);
 
    jmiOpen.addActionListener(this);
    jmiSave.addActionListener(this);
    jmiExit.addActionListener(this);
    jmiAbout.addActionListener(this);
  }
   
 
  public void actionPerformed(ActionEvent e){
    String actionCommand = e.getActionCommand();
 
    if (e.getSource() instanceof JMenuItem){
      if ("Open" .equals(actionCommand)){
        open();
      }
      else if ("Save" .equals(actionCommand)){
        save();
      }
      else if ("About" .equals(actionCommand)){
        JOptionPane.showMessageDialog(this, "Demonstrate Using File Dialogs",
          "About this Demo", JOptionPane.INFORMATION_MESSAGE);
      }
      else if ("Exit" .equals(actionCommand)){
        System.exit(0);
      }
    }
  }
 
  private void open(){
    if (jFileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){
      open(jFileChooser.getSelectedFile());
    }
  }
 
  private void open(File file){
    try{
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
      byte [] b = new byte[in.available()];
      in.read(b, 0, b.length);
      jta.append(new String(b, 0, b.length));
      in.close();
 
      jlblStatus.setText(file.getName() + " opened");
    }
     
    catch(IOException ex){
      jlblStatus.setText("Error opening file " + file.getName());
    }
  }
 
  private void save(){
    if (jFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION){
      save(jFileChooser.getSelectedFile());
    }
  }
 
  private void save(File file){
    try{
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
      byte []  b = (jta.getText()).getBytes();
      out.write(b, 0, b.length);
      out.close();
 
      jlblStatus.setText(file.getName() + " saved ");
    }
 
    catch (IOException ex){
      jlblStatus.setText("Error saving " + file.getName());
    }
  }
}

Ich habe bei meinem eigenen Programm dann versucht den einzubauen und auch zu verstehen. Nur wenn ich dann immer mein Programm öffne, hat es:
1. Ladeprobleme: Entweder sehe ich nur das JMenu, oder es laden nur einzelne Teile dessen was eigentlich erscheinen sollte ???:L
2. Ich kann zwar etwas speichern über die Funktion aus dem code oben, aber kann es leider nicht öffnen :(

Da der anscheinend so nicht richtig funktioniert (so wie ich es eingebaut habe) würde ich gerne mal von euch wissen, ob ihr vielleicht einen anderen simplen aber dennoch guten und funktionierenden code zum speichern kennt. Ich möchte es gern so haben dass das programm dann alle variablen speichert und beim öffnen an die jeweiligen stellen einsetzt.

Hoffe ihr könnt mir dabei helfen!

MfG Blackpixel456

PS: Ich habe den code mal so getestet ohne irgendwas anderes und funktioniert wunderbar.
 
Zuletzt bearbeitet:

A00Sebi

Mitglied
:rtfm:
Hast du schonmal etwas von files gehört?

Java:
private static void restore(){
		String path = System.getenv("APPDATA");
		File APPDATA = new File(path);
		if(APPDATA.exists()){
			APPDATA.getAbsolutePath();
		}
		APPDATA = new File(path + "/" + ApplicationName);
		if(APPDATA.exists()){
			APPDATA.getAbsolutePath();
		}else{
			APPDATA.mkdir();
		}
		path = APPDATA.getAbsolutePath();
		finalpath = path;
		
		File cfg = new File(path + "/cfg.cfg");
		if(cfg.exists()){
			try {
				Scanner cfgScanner = new Scanner(cfg);
				Size = cfgScanner.nextInt();
				Time = cfgScanner.nextInt();
				cfgScanner.close();
			} catch (FileNotFoundException e) {
				fail = true;
				e.printStackTrace();
				return;
			}
		}else{
			try{
				cfg.createNewFile();
			}catch(IOException ex){
				fail = true;
				return;
			}
			try {
				FileWriter cfgWriter = new FileWriter(cfg);
				cfgWriter.write(Size + "\n");
				cfgWriter.write(Time + "\n");
				
				cfgWriter.close();
			} catch (IOException e) {
				fail = true;
				e.printStackTrace();
				return;
				}
			
		}
	}
in diesem Fall lade ich die variablen Time und Size aus der cfg.cfg datei.
DIese LIegt im APPDATA ordner damit dieser code funktioniert brauchst du standartwerte die der code einfügt falls es die datei ncoh nicht gibt. Die variable applicationname ist ein sitring der auch belegt werden muss.

zum Speichern am ende brauchst du einen windowlistener und der DefaultCloseOpperation deines JFrames muss JFrame.DO_NOTHING_ON_CLOSE sein
dann musst du wenn die der windowlistener auf die exittaste anspringt die save methode aufrufen die kann so aussehen, wieder meine zwei variablen.
Java:
File f = new File(Home.finalpath + "/cfg.cfg");
		if(f.exists()){
			System.out.println(true);
			
			try{
				FileWriter fw = new FileWriter(f);
				
				fw.write(String.valueOf(Size -1));
				fw.write(" \n");
				fw.write(String.valueOf(Time));
				fw.close();
			}catch(Exception ex){	}
		}
dabei ist auch der string in meinem Fall in der Home klasse names finalpath wichtig, da diese den weg zum APPDATA verzeihchniss in deinem ordner angibt.

dieser code hat den vorteil dass wenn du mit einem anderen benutzer andere anfangsdaten haben kannst.




Der einzige Nachteil ist, dass das nur auf Windows funktioniert. !!!!!
bei anderen betriebssystemen müsstest du erst rausfiltern was für eins es ist und dann
entsprechend den path ändern und das spielerchen etwas verändert nochmal machen.

Du könntest auch eine datei in der datei machen , das geht aber nichtmehr wenn du es als jar kompelierst, aus mir unbekannten gründen sonst könntest du einfach angeben = new File("cfg.cfg"); das wäre platformunabhängig
du kannst den parameter cfg.cfg ändern aber du solltest eine sionnfollen namen für die datei finden.

PS wenn du den fikle in die jar ,machst ist es natürlich nicht mehr benutzerabhängig

Ich hoffe ich konnte die helfen
und noch etwas zu windowlistener guck mal da vorbei -> https://www.youtube.com/watch?v=RCZGN5gGgL8

vergiss das System.exit nach dem save den der windowlistener aufrufen soll nicht sonst kannst du das programm nur über den compiler schließen !!!

Mit freundlichen Grüßen
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben