Moin Moin,
ich versuche nun seit einigen Tagen ein Problem zu lösen, finde aber relativ wenig zu genau dem Thema.
Ich besitze 2 Forms: LogInForm und TextForm. Die Loginform überprüft die Zugangsdaten und öffnet eine Form mit einer JTextPane, um dort Texte zu speichern. Klicke ich in der TextForm auf Save, soll der Text aus der JTextPane gespeichert werden.
Source LogInForm:
[Java]
public class LogInForm extends JFrame{
private static final long serialVersionUID = 1L;
//
//Deklaration
//
JTextField userNameField = null;
JPasswordField passwordField = null;
JLabel labelUser = null;
JLabel labelPassword = null;
User user = new User();
JOptionPane optionPane = null;
JButton buttonOK = null;
TextForm textform = null;
//Konstruktor
public LogInForm()
{
super();
//Layout setzen
setLayout(new GridLayout(0,1,20,5));
//Form initialize
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("LOGIN");
//OK Button
buttonOK = new JButton("OK");
getRootPane().setDefaultButton(buttonOK);
buttonOK.addActionListener(new ActionListener() {
//Username Serialisiernen
@Override
public void actionPerformed(ActionEvent arg0) {
startTextForm();
try {
OutputStream outputstream = new FileOutputStream("username.ser");
ObjectOutputStream ObjectOutPutStream = new ObjectOutputStream(outputstream);
ObjectOutPutStream.writeObject(userNameField.getText());
ObjectOutPutStream.close();
outputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}});
//UI-Elemente setzen
passwordField = new JPasswordField();
labelUser = new JLabel("Benutzername:");
labelPassword = new JLabel("Kennwort:");
userNameField = new JTextField();
userNameField.setPreferredSize(new Dimension(200,20));
add(labelUser);
add(userNameField);
add(labelPassword);
add(passwordField);
add(buttonOK);
pack();
setLocationRelativeTo(null);
//Username Deserialisieurng
try
{
InputStream inputStream = new FileInputStream("username.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
userNameField.setText((String) objectInputStream.readObject());
userNameField.setText((String) objectInputStream.readObject());
inputStream.close();
objectInputStream.close();
}
catch(FileNotFoundException e) {}
catch(IOException e) {}
catch(ClassNotFoundException e) {}
catch(Exception e) {}
}
private void startTextForm() {
//Abfrage, ob die Logindaten korrekt sind
if(user.checkData(userNameField.getText(), new String(passwordField.getPassword())))
{
InputStream inputStream = null;
ObjectInputStream objectInputStream = null;
//Deserialisieren der gespeicherten Links
try {
if(new File("myData.ser").exists())
{
System.out.println("Lese myData.ser");
inputStream = new FileInputStream("myData.ser");
objectInputStream = new ObjectInputStream(new BufferedInputStream(inputStream));
textform = (TextForm)objectInputStream.readObject();
System.out.println("Lese myData.ser abgeschlossen");
}
}
catch (FileNotFoundException e1) {System.out.println("FileNotFoundException beim einlesen von myData.ser");}
catch(ClassNotFoundException e) {System.out.println("ClassNotFoundException beim einlesen von myData.ser");}
catch(IOException e) {System.out.println("IOException beim einlesen von myData.ser");}
catch(Exception e) {System.out.println("Exception beim einlesen von myData.ser");}
finally{
try {
if(new File("myData.ser").exists())
{
objectInputStream.close();
inputStream.close();
objectInputStream.reset();
System.out.println("InputStreams geschlossen");
}
}
catch(IOException e)
{
}
if(textform == null)
{
textform = new TextForm(this);
System.out.println("Neue Form erstellt, da textform == null");
}
}
//Rufe TextForm auf, und warte bis geschlossen
this.setVisible(false);
textform.setVisible(true);
this.setVisible(true);
passwordField.setText("");
//Bei Save werden die Links serialisiert
if (textform.getResult() == DialogStatus.Save) {
OutputStream outputstream = null;
ObjectOutputStream objectOutPutStream = null;
try{
System.out.println("Result.Save -> schreibe myData.ser");
outputstream = new FileOutputStream("myData.ser");
objectOutPutStream = new ObjectOutputStream(new BufferedOutputStream(outputstream));
objectOutPutStream.writeObject(textform);
System.out.println("Schreibe myData.ser abgeschlossen");
}
catch(FileNotFoundException e) {System.out.println("FileNotFoundException beim schreiben");}
catch(IOException e) {System.out.println("IOException beim schreiben " + e.getMessage());}
catch (Exception e) {System.out.println("Eexception beim schreiben");}
finally {
try {
objectOutPutStream.close();
outputstream.close();
objectOutPutStream.reset();
System.out.println("OutputStreams geschlossen");
}
catch(IOException e)
{
}
}
}
textform.setResult(DialogStatus.OK);
}
else JOptionPane.showMessageDialog(null, "Acces denied. wrong password or username");
}
[/Java]
Source TextForm:
Das Problem:
Wenn ich die Textform serialisiere, schreibt er die myData.ser ohne eine IOException.
Dann öffne ich sie wieder, d.h. er deserialisiert sie wieder.
Klicke ich nun auf die Buttons in der TextForm reagieren sie garnicht auf die Mausklicks. Irgendwie scheint er sie nicht richtig serialisiert bzw. deserialisiert zu haben, gibt aber bis dahin keine Fehlermeldung.
Ich nutze Eclipse Version: Helios Release, Build id: 20100617-1415 unter Windows XP SP3.
Java 1.6.0_21
Falls Infos fehlen, lasst es mich wissen. Ich nehme auch gerne allgemeine Programmiertipps entgegen.
Vielen Dank. MfG,
Timo
ich versuche nun seit einigen Tagen ein Problem zu lösen, finde aber relativ wenig zu genau dem Thema.
Ich besitze 2 Forms: LogInForm und TextForm. Die Loginform überprüft die Zugangsdaten und öffnet eine Form mit einer JTextPane, um dort Texte zu speichern. Klicke ich in der TextForm auf Save, soll der Text aus der JTextPane gespeichert werden.
Source LogInForm:
[Java]
public class LogInForm extends JFrame{
private static final long serialVersionUID = 1L;
//
//Deklaration
//
JTextField userNameField = null;
JPasswordField passwordField = null;
JLabel labelUser = null;
JLabel labelPassword = null;
User user = new User();
JOptionPane optionPane = null;
JButton buttonOK = null;
TextForm textform = null;
//Konstruktor
public LogInForm()
{
super();
//Layout setzen
setLayout(new GridLayout(0,1,20,5));
//Form initialize
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("LOGIN");
//OK Button
buttonOK = new JButton("OK");
getRootPane().setDefaultButton(buttonOK);
buttonOK.addActionListener(new ActionListener() {
//Username Serialisiernen
@Override
public void actionPerformed(ActionEvent arg0) {
startTextForm();
try {
OutputStream outputstream = new FileOutputStream("username.ser");
ObjectOutputStream ObjectOutPutStream = new ObjectOutputStream(outputstream);
ObjectOutPutStream.writeObject(userNameField.getText());
ObjectOutPutStream.close();
outputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}});
//UI-Elemente setzen
passwordField = new JPasswordField();
labelUser = new JLabel("Benutzername:");
labelPassword = new JLabel("Kennwort:");
userNameField = new JTextField();
userNameField.setPreferredSize(new Dimension(200,20));
add(labelUser);
add(userNameField);
add(labelPassword);
add(passwordField);
add(buttonOK);
pack();
setLocationRelativeTo(null);
//Username Deserialisieurng
try
{
InputStream inputStream = new FileInputStream("username.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
userNameField.setText((String) objectInputStream.readObject());
userNameField.setText((String) objectInputStream.readObject());
inputStream.close();
objectInputStream.close();
}
catch(FileNotFoundException e) {}
catch(IOException e) {}
catch(ClassNotFoundException e) {}
catch(Exception e) {}
}
private void startTextForm() {
//Abfrage, ob die Logindaten korrekt sind
if(user.checkData(userNameField.getText(), new String(passwordField.getPassword())))
{
InputStream inputStream = null;
ObjectInputStream objectInputStream = null;
//Deserialisieren der gespeicherten Links
try {
if(new File("myData.ser").exists())
{
System.out.println("Lese myData.ser");
inputStream = new FileInputStream("myData.ser");
objectInputStream = new ObjectInputStream(new BufferedInputStream(inputStream));
textform = (TextForm)objectInputStream.readObject();
System.out.println("Lese myData.ser abgeschlossen");
}
}
catch (FileNotFoundException e1) {System.out.println("FileNotFoundException beim einlesen von myData.ser");}
catch(ClassNotFoundException e) {System.out.println("ClassNotFoundException beim einlesen von myData.ser");}
catch(IOException e) {System.out.println("IOException beim einlesen von myData.ser");}
catch(Exception e) {System.out.println("Exception beim einlesen von myData.ser");}
finally{
try {
if(new File("myData.ser").exists())
{
objectInputStream.close();
inputStream.close();
objectInputStream.reset();
System.out.println("InputStreams geschlossen");
}
}
catch(IOException e)
{
}
if(textform == null)
{
textform = new TextForm(this);
System.out.println("Neue Form erstellt, da textform == null");
}
}
//Rufe TextForm auf, und warte bis geschlossen
this.setVisible(false);
textform.setVisible(true);
this.setVisible(true);
passwordField.setText("");
//Bei Save werden die Links serialisiert
if (textform.getResult() == DialogStatus.Save) {
OutputStream outputstream = null;
ObjectOutputStream objectOutPutStream = null;
try{
System.out.println("Result.Save -> schreibe myData.ser");
outputstream = new FileOutputStream("myData.ser");
objectOutPutStream = new ObjectOutputStream(new BufferedOutputStream(outputstream));
objectOutPutStream.writeObject(textform);
System.out.println("Schreibe myData.ser abgeschlossen");
}
catch(FileNotFoundException e) {System.out.println("FileNotFoundException beim schreiben");}
catch(IOException e) {System.out.println("IOException beim schreiben " + e.getMessage());}
catch (Exception e) {System.out.println("Eexception beim schreiben");}
finally {
try {
objectOutPutStream.close();
outputstream.close();
objectOutPutStream.reset();
System.out.println("OutputStreams geschlossen");
}
catch(IOException e)
{
}
}
}
textform.setResult(DialogStatus.OK);
}
else JOptionPane.showMessageDialog(null, "Acces denied. wrong password or username");
}
[/Java]
Source TextForm:
Java:
public class TextForm extends JDialog implements Serializable {
private static final long serialVersionUID = 7437549011702785251L; // 7437549011702785251L
//DEKLARATION
//private JTextPane textfield = null;
private JTextPane jlist = null;
private JButton buttonSave = null;
private JButton buttonCancel = null;
private JPanel pnlTextBox = new JPanel(new BorderLayout());
private JPanel pnlButtons = new JPanel(new GridLayout(1, 3, 20, 20));
DialogStatus result;
public TextForm(LogInForm LogForm)
{
//Macht den JDialog modal!
super(LogForm, true);
//FORM
setTitle("TEXTEditor");
setSize(700,500);
setLocationRelativeTo(null);
//TEXTBOX
// textfield = new JTextPane();
// textfield.setContentType("text/html");
jlist = new JTextPane();
pnlTextBox.add(jlist, BorderLayout.CENTER);
pnlTextBox.add(new JScrollPane(jlist));
//BUTTONS
buttonSave = new JButton("Save");
pnlButtons.add(buttonSave);
buttonCancel = new JButton("Cancel");
pnlButtons.add(buttonCancel);
//PANELS
add(pnlTextBox, BorderLayout.CENTER);
add(pnlButtons, BorderLayout.SOUTH);
//EVENTS
buttonCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
result = DialogStatus.OK;
setVisible(false);
}});
buttonSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
result = DialogStatus.Save;
setVisible(false);
}});}
public void setResult(DialogStatus result) {
this.result = result;
}
public DialogStatus getResult()
{
return result;
}
}
Das Problem:
Wenn ich die Textform serialisiere, schreibt er die myData.ser ohne eine IOException.
Dann öffne ich sie wieder, d.h. er deserialisiert sie wieder.
Klicke ich nun auf die Buttons in der TextForm reagieren sie garnicht auf die Mausklicks. Irgendwie scheint er sie nicht richtig serialisiert bzw. deserialisiert zu haben, gibt aber bis dahin keine Fehlermeldung.
Provoziere ich eine Exception durch häufiges öffnen und schliessen (über das X), wirft er folgendes:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.JEditorPane.getPreferredSize(Unknown Source)
at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at java.awt.Dialog.conditionalShow(Unknown Source)
at java.awt.Dialog.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at java.awt.Dialog.setVisible(Unknown Source)
at LogInForm.startTextForm(LogInForm.java:157)
at LogInForm.access$0(LogInForm.java:109)
at LogInForm$1.actionPerformed(LogInForm.java:62)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)[/code]
Ich nutze Eclipse Version: Helios Release, Build id: 20100617-1415 unter Windows XP SP3.
Java 1.6.0_21
Falls Infos fehlen, lasst es mich wissen. Ich nehme auch gerne allgemeine Programmiertipps entgegen.
Vielen Dank. MfG,
Timo