Bestimmten Constructor aufrufen

lisali

Erfahrenes Mitglied
Hallo,

ich hab folgenden Code:

Java:
	public Serialize() throws Exception {
		FileOutputStream fos = new FileOutputStream("test.ser"); // create new file through FileOutputStream
		ObjectOutputStream oos = new ObjectOutputStream(fos); // create new ObjectOutputStream using FileOutputStream
		oos.writeObject(frame); // write object "frame" to ObjectOutputStream
		oos.close(); // close ObjectOutputStream
		fos.close(); // close FileOutputStream
	}

Also, in oos.writeObject(frame); steckt der Fehler, weil ich jetzt die Variable "frame" rausgelöscht habe. Nämlich das hier:

Code:
	MyFrame frame = new MyFrame("title");


Das Problem ist jetzt, dass ich die Klasse MyFrame habe und diese 2 Constructor hat.
Ein Constructor verlangt einen String und der andere verlangt nix.
Und ich möchte gern den Constructor aufrufen, der einen String als Parameter übergibt.

Das würde ja auch so gehen, wenn ich den rausgelöschten Code wieder einsetzen würde, jedoch erstellt er dann auch ein neues Frame und das möchte ich nicht.

Die Frage ist also wie ich jetzt bei oos.writeObject(....); angeben kann, dass ich den String-verlangenden Constructor von MyFrame rufen kann, ohne halt ein neues Fenster zu erstellen wie ich eben beschrieben habe?
 
Hallo,

das funktioniert nicht. Da bei einem Contructor-Aufruf ein neues Object erzeugt wird. In dem Fall ist es ein Fenster.

Was genau möchtest du denn tun?

Gruß

Sascha
 
Hey,

kannst du dein Problem noch etwas weiter umschreiben? Verstehe dein Prob. nicht so ganz! Anscheinend initiiert dein Konstruktor die Visualisierung? Richtig? Evtl. trennen?

Gruß Kon
 
Hey,

also mein Ziel ist, dass ich beim Aufruf der Klasse Serialize die Werte in test.ser schreibe. Später rufe ich dann manuell die Klasse Deserialize auf, weil ich mit Benutzung dieser test.ser dann diese Werte benutze. Das heißt, wenn ich bei "MyFrame" (also die Klasse mit dem Fenster-Aufruf) bestimmte Sachen ändere, was ins Textfeld schreibe, die Größe des Fensters ändere, usw. das alles in test.ser geschrieben wird und beim Aufruf von Deserialize soll eben genau das Fenster mit Benutzung der test.ser verwendet und dargestellt werden.

Mein Code sieht bisher so aus:

serialize class:
Java:
	public Serialize() throws Exception {
		FileOutputStream fos = new FileOutputStream("test.ser"); // create new file through FileOutputStream
		ObjectOutputStream oos = new ObjectOutputStream(fos); // create new ObjectOutputStream using FileOutputStream
		oos.writeObject(frame); // write object "frame" to ObjectOutputStream
		oos.close(); // close ObjectOutputStream
		fos.close(); // close FileOutputStream
	}
deserialize:
Java:
	public static void main(String[] args) throws Exception {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"));
    MyFrame f = (MyFrame) ois.readObject(); // reads file
    ois.close(); // close ObjectInputStream
    f.setVisible(true); // make frame visible
	}
myframe class:
Java:
public class MyFrame extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	
	public MyFrame() {
	// empty constructor
	}
	
	public MyFrame(String title) { 
	    JFrame frame = new JFrame(title); // create JFrame and set title of frame through constructor call
	    frame.setLayout(new BorderLayout()); // set new layout for "frame"
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // exit/terminate program on close
	    
	    JLabel label = new JLabel("Please type something in the following textarea:"); // notify user to make an input via JLabel
	    JTextArea textArea = new JTextArea("", 5, 10); // create textarea to make an input
	    JButton button = new JButton("Serialize"); // button to invoke the serialize class
	    button.addActionListener(this); // add ActionListener to JButton for actionPerformed method
	    frame.add(BorderLayout.NORTH,label); // set text/label to north
	    frame.add(BorderLayout.CENTER,textArea); // set textarea to center
	    frame.add(BorderLayout.SOUTH,button); // set textarea to south	    
	    frame.setSize(400,200); // set x,y frame size
	    frame.setVisible(true); // make frame visible
	}
	
	public static void main(String[] args) {
		MyFrame frame = new MyFrame("Project: Serialization using ObjectStream"); // call MyFrame class with specified title parameter 
	}

	public void actionPerformed(ActionEvent e) {
		try {
			System.out.println("trying to invoke serialize class...");
			new Serialize();
			System.out.println("serialize class was invoked successfully...");
		} catch (Exception ex) {
			ex.printStackTrace();
		}	
	}
	
}
 
Also ich würde das komplett anders lösen. Ich würde mir die einzelnen Werte des Fensters holen und diese speichern und diese beim laden wieder setzen.

Aber um es so zu machen wie du es möchtest, würde ich keine Klasse nehmen die Serialisiert, sondern würde in deinem MyFrame zwei Methoden schreiben.

Java:
public class MyFrame extends JFrame implements ActionListener {
 
    private static final long serialVersionUID = 1L;
    
    public MyFrame() {
    // empty constructor
    }
    
    public MyFrame(String title) { 
        JFrame frame = new JFrame(title); // create JFrame and set title of frame through constructor call
        frame.setLayout(new BorderLayout()); // set new layout for "frame"
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // exit/terminate program on close
        
        JLabel label = new JLabel("Please type something in the following textarea:"); // notify user to make an input via JLabel
        JTextArea textArea = new JTextArea("", 5, 10); // create textarea to make an input
        JButton button = new JButton("Serialize"); // button to invoke the serialize class
        button.addActionListener(this); // add ActionListener to JButton for actionPerformed method
        frame.add(BorderLayout.NORTH,label); // set text/label to north
        frame.add(BorderLayout.CENTER,textArea); // set textarea to center
        frame.add(BorderLayout.SOUTH,button); // set textarea to south      
        frame.setSize(400,200); // set x,y frame size
        frame.setVisible(true); // make frame visible
    }
    
    public static void main(String[] args) {
        MyFrame frame = new MyFrame("Project: Serialization using ObjectStream"); // call MyFrame class with specified title parameter 
    }
 
    public void actionPerformed(ActionEvent e) {
        try {
            System.out.println("trying to invoke serialize class...");
            serialize(this);
            System.out.println("serialize class was invoked successfully...");
        } catch (Exception ex) {
            ex.printStackTrace();
        }   
    }
    
public static void serialize(JFrame frame){
    FileOutputStream fos = new FileOutputStream("test.ser"); // create new file through FileOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(fos); // create new ObjectOutputStream using FileOutputStream
        oos.writeObject(frame); // write object "frame" to ObjectOutputStream
        oos.close(); // close ObjectOutputStream
        fos.close(); // close FileOutputStream
}


public static void deserialize() throws Exception {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"));
    MyFrame f = (MyFrame) ois.readObject(); // reads file
    ois.close(); // close ObjectInputStream
    f.setVisible(true); // make frame visible
    }
}

Java:
public static void main(String[] args) throws Exception {
    MyFrame.deserialize();
    }

Allerdings würde ich dann den Dateinamen mitgeben.

Gruß

Sascha
 
Hey Sascha,

danke für deine Bemühung, aber ich hab leider folgende Angaben und soll das in 3 Klassen unterteilen:

It is also possible to write objects to an output stream. For this we use the class ObjectOutputStream. The process of writing Objects is called Serialization. Any class that implements the Serializable interface can be serialized.

* Write a class called MyFrame that extends the JFrame class. It should contain a JTextArea in a BorderLayoiut.CENTER position. Note that the class JFrame already implents the Serializable interface. Make sure the class has an empty default contructor and a constructor that takes one String which takes the titlte of the frame.
* Next write a class called Serialize. In this class create an instance of the MyFrame, make it visible and then write it to a file called ’test.ser’ using an ObjectOutputStream together with a FileOutputStream.
* Now read the MyFrame back from the file ’test.ser’ using an ObjectInputStream. Do this in a new class called Deserialize. You may have to set the MyFrame object visible using the setVisible(true) method.
* Finally, add a JButton to the MyFrame, and modify the code such, that the MyFrame serializes itself, when the button is pressed. Now type seomthing in the textarea, change the size of the frame, and move it. Then serialize it. After exiting the program and running the deserialize program from the last step, the frame will be recreated at exactly the same position, with the same size and content as it had just before the serialization occurred.
* Important: when objects get deserialzed, the constructor does not get called, hence do not do important things in the constructor! Second, you need to be very carefull about the serialVersionUID!

When writing code for the project please make sure to follow our coding convention and use JavaDoc to comment your source code.
 
Ok. Bei der Aufgabenstellung bleiben aber Fragen offen. Ich hab es mal so umgesetzt, dass nicht viele Änderungen drin sind.

Java:
public class MyFrame extends JFrame implements ActionListener, Serializable {
 
    private static final long serialVersionUID = 1L;
    
    public MyFrame() {
    // empty constructor
    }
    
    public MyFrame(String title) { 
        super(title); // create JFrame and set title of frame through constructor call
        setLayout(new BorderLayout()); // set new layout for "frame"
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // exit/terminate program on close
        
        JLabel label = new JLabel("Please type something in the following textarea:"); // notify user to make an input via JLabel
        JTextArea textArea = new JTextArea("", 5, 10); // create textarea to make an input
        JButton button = new JButton("Serialize"); // button to invoke the serialize class
        button.addActionListener(this); // add ActionListener to JButton for actionPerformed method
       add(BorderLayout.NORTH,label); // set text/label to north
        add(BorderLayout.CENTER,textArea); // set textarea to center
        add(BorderLayout.SOUTH,button); // set textarea to south      
        setSize(400,200); // set x,y frame size
       setVisible(true); // make frame visible
    }
    
    public static void main(String[] args) {
        MyFrame frame = new MyFrame("Project: Serialization using ObjectStream"); // call MyFrame class with specified title parameter 
    }
 
    public void actionPerformed(ActionEvent e) {
        try {
            System.out.println("trying to invoke serialize class...");
            new Serialize(this);
            System.out.println("serialize class was invoked successfully...");
        } catch (Exception ex) {
            ex.printStackTrace();
        }   
    }
    
}

Java:
public class Serialize{
public Serialize() throws Exception {
        this(new MyFrame("Title"));
    }

public Serialize(Serializable serializable){
FileOutputStream fos = new FileOutputStream("test.ser"); // create new file through FileOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(fos); // create new ObjectOutputStream using FileOutputStream
        oos.writeObject(serializable); // write object "frame" to ObjectOutputStream
        oos.close(); // close ObjectOutputStream
        fos.close(); // close FileOutputStream
}
}

Java:
public class Deserialize{

   public Deserialize(){
   {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"));
    MyFrame f = (MyFrame) ois.readObject(); // reads file
    ois.close(); // close ObjectInputStream
    f.setVisible(true); // make frame visible
    }
   }

}

Gruß

Sascha
 
Eine kleine Frage zu dem Thema hätte ich noch...
Wird bei der Deserialisierung eines JFrames das Fenster sofort wieder angezeigt?
Oder muss man noch setVisible() aufrufen?
 
Zurück