/* Autor:           Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
   Firma:           HS Harz, FB AI
   Version:         1.1
   Ersterstellung:  10.12.2010
   Letzte Änderung: 11.12.2010
*/

/*
		Pattern p = Pattern.compile(
"([a-zA-Z0-9])+([\\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-]+)+");
		Matcher m = p.matcher(addressField.getText());

String number_between_0_and_255 = "(([0-9]{1,2})|([01][0-9]{2})|(2((5[0-5])|([0-4][0-9]))))";
String valid_ipv4 = "(" + number_between_0_and_255 + "\\.){3}" + number_between_0_and_255;
String valid_mail = "^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,4}$";
System.out.println("192.168.178.0".matches(valid_ipv4));
System.out.println("192.168.178.".matches(valid_ipv4));
System.out.println("9.9.9.9".matches(valid_ipv4));
System.out.println("192.168.256.1".matches(valid_ipv4));
System.out.println("127.1.0.0".matches(valid_ipv4));
System.out.println("webmaster@java-blog-buch.de".matches(valid_mail));
System.out.println("a@b.c".matches(valid_mail));
System.out.println("asdf.de".matches(valid_mail));
System.out.println("ich@du.info".matches(valid_mail));
System.out.println("devil666@hell.com".matches(valid_mail));

Beispiele
http://regexlib.com/

*/


import java.awt.*;
import javax.swing.*;

import java.awt.event.*;

// Clientfenster
import java.awt.*;
import java.awt.event.*;


import java.util.Vector;
import javax.swing.table.*;

// Einlesen
import java.io.*;

import java.awt.event.*;
import java.beans.PropertyVetoException;
import javax.swing.*;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Plausi8 extends JFrame  {


    String _sFilename=null;

  private JMenuBar menuBar1;
  private JMenu MainFile;

  private JMenuItem MnNew;  
  private JMenuItem MnOpen; 
  private JMenuItem MnSave;
  private JMenuItem MnSaveAs;    // Menüeintrag

  JToolBar toolBar = new JToolBar();
  JButton BnNew = new JButton("Neu");
  JButton BnOpen = new JButton("Oeffnen");
  JButton BnSave = new JButton("Speichern");


 private JLabel LName = new JLabel("Name");

  private JLabel LVorname = new JLabel("Vorname");

  private JTextField TName;
  private JTextField TVorname;
  private JTextField TMatrNr;
  private JTextField TNote;

  private JLabel LNote;

  private JLabel LMatrNr;

  CStudent _student;

    public Plausi8() {
        setSize(600,200);
        setLocation(100,100);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setGUI();           
    }

    private void setGUI() {
        this.getContentPane().setLayout( new BorderLayout() );
        JPanel panelGUI = new JPanel();
        panelGUI.setLayout( new GridBagLayout() );
        setMenues();
        

        LVorname = new JLabel("Vorname");
        LName = new JLabel("Name");
        LMatrNr = new JLabel("MatrNr");
        LNote = new JLabel("Durchschnittsnote");

        TVorname = new JTextField();
        TName = new JTextField();
        TMatrNr = new JTextField();
        TNote = new JTextField();

        LVorname.setFont( new Font("Arial", Font.BOLD,18)  );
        LName.setFont( new Font("Arial", Font.BOLD,18)  );
        LMatrNr.setFont( new Font("Arial", Font.BOLD,18)  );
        LNote.setFont( new Font("Arial", Font.BOLD,18)  );
        TVorname.setFont( new Font("Arial", Font.BOLD,18)  );
        TName.setFont( new Font("Arial", Font.BOLD,18)  );
        TMatrNr.setFont( new Font("Arial", Font.BOLD,18)  );
        TNote.setFont( new Font("Arial", Font.BOLD,18)  );

        this.getContentPane().add(toolBar, BorderLayout.NORTH);
        this.getContentPane().add(panelGUI, BorderLayout.CENTER);


        panelGUI.add(LVorname,  new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
                ,GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(10,10,0,0), 0, 0));

        panelGUI.add(TVorname,   new GridBagConstraints(1, 0, 1, 1, 40.0, 0.0
                ,GridBagConstraints.WEST,  GridBagConstraints.HORIZONTAL,
                new Insets(10,10,0,40), 0, 0));

        // ----------------------------------------------
        panelGUI.add(LName,  new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0
                ,GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(10,10,0,0), 0, 0));

        panelGUI.add(TName,   new GridBagConstraints(3, 0, 1, 1, 60.0, 0.0
                ,GridBagConstraints.WEST,  GridBagConstraints.HORIZONTAL,
                new Insets(10,10,0,10), 0, 0));
        // ----------------------------------------------
        panelGUI.add(LMatrNr,  new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
                ,GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(10,10,0,0), 0, 0));

        panelGUI.add(TMatrNr,   new GridBagConstraints(1, 1, 1, 1, 40.0, 0.0
                ,GridBagConstraints.WEST,  GridBagConstraints.HORIZONTAL,
                new Insets(10,10,0,40), 0, 0));

        // ----------------------------------------------
        panelGUI.add(LNote,  new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
                ,GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(10,10,0,0), 0, 0));

        panelGUI.add(TNote,   new GridBagConstraints(3, 1, 1, 1, 60.0, 0.0
                ,GridBagConstraints.WEST,  GridBagConstraints.HORIZONTAL,
                new Insets(10,10,0,10), 0, 0));

        _student = new CStudent();    

    }  // setGUI

    private void setMenues() {
        menuBar1 = new JMenuBar();

          // DATEI
        MainFile = new JMenu("Datei");
        MnNew = new JMenuItem("Neu");
        MnOpen = new JMenuItem("Oeffnen");
        MnSave = new JMenuItem("Speichern");
        MnSaveAs = new JMenuItem("Speichern Als");
        MainFile.add(MnOpen);
        MainFile.add(MnSave);
        menuBar1.add(MainFile);

        this.setJMenuBar(menuBar1);
        MnNew.addActionListener(new ActionListener()  {
          public void actionPerformed(ActionEvent e) {
            MnNew_Click();
          }
        });
          // Short Key definieren  STRG+O
        MnNew.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
        BnNew.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            MnNew_Click();
          }
        });
        toolBar.add(BnNew);
        BnNew.setFont( new Font("Arial", Font.BOLD,18)  );

    

        MnOpen.addActionListener(new ActionListener()  {
          public void actionPerformed(ActionEvent e) {
            MnOpen_Click();
          }
        });
          // Short Key definieren  STRG+O
        MnOpen.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
        BnOpen.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            MnOpen_Click();
          }
        });
        toolBar.add(BnOpen);
        BnOpen.setFont( new Font("Arial", Font.BOLD,18)  );


        MnSave.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
    
        MnSave.addActionListener(new ActionListener()  {

          public void actionPerformed(ActionEvent e) {
            MnSave_Click();
          }
        });

        MnSaveAs.addActionListener(new ActionListener()  {
          public void actionPerformed(ActionEvent e) {
            MnSaveAs_Click();
          }
        });
        BnSave.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            MnSave_Click();
          }
        });
        toolBar.add(BnSave);
        BnSave.setFont( new Font("Arial", Font.BOLD,18)  );


         // Menüeinträge zum MainFile hinzufügen
        MainFile.add(MnSaveAs);
    
    }  // setMenues


    void MnNew_Click() {
        _sFilename=null;
        TVorname.setText("");
        TName.setText("");

        TMatrNr.setText( "");
        TNote.setText( "" );    
    }

    void MnOpen_Click() {
     JFileChooser jFileChooser1 = new JFileChooser();
       // setzen der Optionen
     jFileChooser1.setMultiSelectionEnabled(false);
     // setze das aktuelle Verzeichnis
     jFileChooser1.setCurrentDirectory(  new File(  (String) System.getProperties().get("user.dir")  )   );
        // Aufruf des Dialogfensters
      if (JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)) {
          // holen des Dateinamens
        String sFileName = jFileChooser1.getSelectedFile().getPath();
        loadData(sFileName);
      }
    }  // MnOpen
  
  

    private void loadData(String sFilename) {
        _sFilename = sFilename;
        try {
          _student.LoadFromData( _sFilename );  // Datensätze erzeugen
        }
        catch (IOException ee) {
          System.err.println("IOException: " + ee);
        }
        TVorname.setText(_student.getVorname() );
        TName.setText(_student.getName() );

        TMatrNr.setText( Integer.toString( _student.getMatrNr() ));
        TNote.setText( "1.3" );    
       
    }  // loadData


   private void MnSave_Click() {
      if (_sFilename==null)
        MnSaveAs_Click();
      else
        SaveToFile();
  }


  private void  SaveToFile() {
      Pattern p, p1, p2;
      Matcher m, m1, m2;
      String sStr;
      System.out.println("save 1");
      CStudent std = new CStudent();  // temporaerer Student
      sStr = TVorname.getText().trim();
      p = Pattern.compile("([A-Z][a-z]+)([ ][A-Z][a-z]+)*");
      m = p.matcher(sStr);
      if ( ! m.matches() ) {
        CBasis.Error("Fehler1","Fehlerhafter Wert im Vorname,\nAnfangszeichen groß,\nLeerzeichen zwischen Wörtern");
        TVorname.requestFocus(); // setzen des Fokus
        return;
      }
      System.out.println("save 2");
      if ( ! std.setVorname( TVorname.getText() ) ) {
        CBasis.Error("Fehler2","Fehlerhafter Wert im Vorname, mehr Zeichen");
        TVorname.requestFocus(); // setzen des Fokus
        return;
      }

      sStr = TName.getText().trim();
      m = p.matcher(sStr);
      if ( ! m.matches() ) {
        CBasis.Error("Fehler1","Fehlerhafter Wert im Namen,\nAnfangszeichen groß,\nLeerzeichen zwischen Wörtern");
        TName.requestFocus(); // setzen des Fokus
        return;
      }
      if ( ! std.setName( sStr ) ) {
        CBasis.Error("Fehler2","Fehlerhafter Wert im Namen, mehr Zeichen");
        TName.requestFocus(); // setzen des Fokus
        return;
      }

        // diese Namen der Methoden sind doppelt
        // int und double  und String
      p = Pattern.compile("[+]?[0-9]+");
      sStr = TMatrNr.getText().trim();
      m = p.matcher(sStr);
      if ( ! m.matches() ) {
         CBasis.Error("Fehler","Fehlerhafter Wert in MatrNr, kein numerischer Wert");
         TMatrNr.requestFocus(); // setzen des Fokus
         return;
      }
      int iValue = Integer.parseInt(sStr);  // klappt dank Parser
      if ( (iValue<1000) || (iValue>100000) ) {
        CBasis.Error("Fehler","Fehlerhafter Wert in MattrNr, von 1000 bis 100000");
        TMatrNr.requestFocus(); // setzen des Fokus
        return;
      }

      p1 = Pattern.compile("[+]?[1-4].?[037]?");
      p2 = Pattern.compile("[+]?[5].?[0]?");
      sStr = TNote.getText().trim();
      m1 = p1.matcher(sStr);
      m2 = p2.matcher(sStr);
      if ( ! m1.matches() && ! m2.matches() ) {
         CBasis.Error("Fehler1","Fehlerhafter Wert in Note, \n"+
               "1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 5.0");
         TNote.requestFocus(); // setzen des Fokus
         return;
      }
      if ( ! std.setNote( sStr ) ) {
         CBasis.Error("Fehler2","Fehlerhafter Wert in Note, \n"+
               "1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 5.0");
         TNote.requestFocus(); // setzen des Fokus
         return;
      }


      _student.setVorname( TVorname.getText() );
      _student.setName( TName.getText() );
      if (CBasis.IVal(TMatrNr.getText()) ) {
         _student.setMatrNr( CBasis.getIValResult() );
      }
      else{
          // eigentlich ueberfluessig
        CBasis.Error("Speichern","Fehlerhafte Daten in der MatrNr");
        return;
      }
      if (CBasis.DVal(TNote.getText()) ) {
         _student.setNote( CBasis.getIValResult() );
      }
      else{
          // eigentlich ueberfluessig
        CBasis.Error("Speichern","Fehlerhafte Daten in der MatrNr");
        return;
      }
      _student.SaveToData(_sFilename);      
  }  // Save


  private void MnSaveAs_Click() {
   JFileChooser jFileChooser1 = new JFileChooser();
   String sFileName;

   jFileChooser1.setCurrentDirectory(  new File(  (String) System.getProperties().get("user.dir")  )   );
	// Ok-Schalter gedrückt ?
    if (JFileChooser.APPROVE_OPTION == jFileChooser1.showSaveDialog(this)) {
      _sFilename = jFileChooser1.getSelectedFile().getPath();
      SaveToFile();
    }
  }


 
   static public void main(String[] args) {
        Plausi8 frame = new Plausi8();
        frame.setVisible(true);
  }

}



class CStudent {
 private  String _Name;
 private  String _Vorname;
 private  int _MatrNr;
 private  double _Note;

  public CStudent(){
    this ( "Noname", "-", 1000, 1.0 );
  }

  public CStudent(String Name, String Vorname, int MatrNr, double Note){
    _Name = Name;
    _Vorname = Vorname;
    _MatrNr = MatrNr;
    _Note = Note;     
  }



  public void SaveToData( String sFileName )  {
    FileOutputStream Fout;
    DataOutputStream Dout;
    int i;

    try {
      Fout = new FileOutputStream(sFileName);
      Dout = new DataOutputStream(Fout);

      Dout.writeUTF( _Name );
      Dout.writeUTF( _Vorname );
      Dout.writeInt( _MatrNr );
      Dout.writeDouble( _Note );
      System.out.println("SaveToData Student");
      Dout.close();
    }
    catch (IOException ee) {
      System.err.println("IOException: " + ee);
    }

  } // SaveToData Student

  public void LoadFromData( String sFileName ) throws IOException {
    FileInputStream Fin;
    DataInputStream DataIn;
    int i, n;    

    try {
      Fin = new FileInputStream(sFileName);
      DataIn = new DataInputStream(Fin);

      _Name    = DataIn.readUTF();
      _Vorname = DataIn.readUTF();
      _MatrNr  = DataIn.readInt(  );
      _Note    = DataIn.readDouble(  );
      System.out.println("LoadFromData Student");
      DataIn.close();
    }
    catch (IOException ee) {
      System.err.println("IOException: " + ee);
    }

  } // LoadFromData



  // Methoden zum setzen und holen der Attribute

  public String getName() {
    return _Name;
  }
  public boolean setName(String Name) {
    String s = Name.trim();  // loeschen der Leerzeichen am Anfang und Ende
    if (s.length()>1) {
      _Name = s;
      return true;
    }
    else {
       CBasis.Error("setName","Fehlerhafter Name, zu kurz");
      return false;
    }
  }


  public String getVorname() {
    return _Vorname;
  }
  public boolean setVorname(String Vorname) {
    String s = Vorname.trim();  // loeschen der Leerzeichen am Anfang und Ende
    if (s.length()>0) {
      _Vorname = s;
      return true;
    }
    else {
       CBasis.Error("setVorname","Fehlerhafter Vorname, zu kurz");
      return false;
    }
  }  // setVorname

   public int getMatrNr() {
    return _MatrNr;
  }

  public boolean setMatrNr( String sMatrNr) {
      if (CBasis.IVal(sMatrNr) ) {
         int iValue = CBasis.getIValResult();   // wert holen
         if ( (iValue<1000) || (iValue>100000) ) {
           return false;
         }
         else {
           _MatrNr = iValue;
           return true;
         }
      }
      else {
        return false;
      }
  }  // setMatrNr

  public void setMatrNr(int MatrNr) {
    if (MatrNr>1000) {
     _MatrNr = MatrNr;
    }
    else {
       CBasis.Error("setName","Fehlerhafte Matrnr, zu kurz");
    }
  }  // setMatrNr


  public double getNote() {
    return _Note;
  }
  public boolean setNote(String sNote) {
     double dValue;
     if (CBasis.DVal(sNote) ) {
         dValue = CBasis.getDValResult();  // wert holen
         if ( (dValue!=1.0) && (dValue!=1.3) && (dValue!=1.7) && (dValue!=2.0) &&
              (dValue!=2.3) && (dValue!=2.7) && (dValue!=3.0) && (dValue!=3.3) &&
              (dValue!=3.7) && (dValue!=4.0) && (dValue!=5.0) ) {
           return false;
         }
         else {
           _Note=dValue;
           return true;
         }
      }    
    else {
       return false;
    }
  }  // setNote


  public void setNote(double dNote) {
    if ( (dNote!=1.0) && (dNote!=1.3) && (dNote!=1.7) && (dNote!=2.0) &&
         (dNote!=2.3) && (dNote!=2.7) && (dNote!=3.0) && (dNote!=3.3) &&
         (dNote!=3.7) && (dNote!=4.0) && (dNote!=5.0) ) {
       _Note = dNote;
    }
    else {
       CBasis.Error("setName","Fehlerhafte Note, negativ");
    }
  }  // setNote

}  // CStudent




class CBasis {

    public static final int C_LEER = 1;
    public static final int C_KEINEZAHL = 2;
    public static final int C_ZUKLEIN = 3;
    public static final int C_ZUGROSS = 4;

      // Konstanten für den Error Code als String
    public static final String SZ_LEER = "Leerer Text";
    public static final String SZ_KEINEZAHL = "Konvertierung schlug fehl";
    public static final String SZ_ZUKLEIN = "Für den Bereich zu klein";
    public static final String SZ_ZUGROSS = "Für den Bereich zu groß";


    private static int intVal;          // speichert das Ergebnis
    private static long longVal;        // speichert das Ergebnis
    private static double dblVal;       // speichert das Ergebnis

    private static int ValError = 0;   // speichert den Konvertierungfehler


    public static int IntVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        String s;
        int intVal;
        s = new String(szText); // neues Objekt
        s = s.trim();
        if (s.length() == 0 ) {
            return 0;
        }
        else {
            try {
                intVal = Integer.valueOf(szText).intValue();
                return intVal;
            }
            catch (NumberFormatException e) {
                return 0;
            }
        }
    } // IVal




    // Zeigt eine Fehlermeldung an
  public static void Error( String sTitle, String sMessage) {
    JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.DEFAULT_OPTION,
      JOptionPane.ERROR_MESSAGE);  // Symbol
    /*  Optionen der Schalter:
         DEFAULT_OPTION    Ok
         YES_NO_OPTION
         YES_NO_CANCEL_OPTION
         OK_CANCEL_OPTION
     */
     /*  Symbole:
      ERROR_MESSAGE
      INFORMATION_MESSAGE
      WARNING_MESSAGE
      QUESTION_MESSAGE
      PLAIN_MESSAGE
     */

  } // Fehler


    // Eingabe eines String
  public static String getInput( String sTitle, String sMessage) {
    return JOptionPane.showInputDialog(null, sTitle, sMessage, 1);
  } //



        // Eingabe eines String
  public static String getInput( String sTitle, String sMessage, String sInput) {
    return (String) JOptionPane.showInputDialog( null,sMessage, sTitle, JOptionPane.PLAIN_MESSAGE,
       null, null, sInput);
  } //




    // -------------------------------------------

      // gibt einen Klartext für die Konvertierung aus
    public static String getErrorCode() {
      switch (ValError) {
        case C_LEER :      return SZ_LEER;
        case C_KEINEZAHL : return SZ_KEINEZAHL;
        case C_ZUKLEIN :   return SZ_ZUKLEIN;
        case C_ZUGROSS :   return SZ_ZUGROSS;
        default:           return "Fehlerhafter Index in Methode getErrorCode: "+Integer.toString(ValError);
      } // switch
    }


    public static boolean IVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(szText); // neues Objekt
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            intVal = 0;
            result = false;
        }
        else {
            try {
                intVal = Integer.valueOf(szText).intValue();
                ValError = 0;
            }
            catch (NumberFormatException e) {
                // Check ob die "Zahl" für den Integerbereich zu klein oder zu groß
                // System.err.println(e);
                try {
                    dblVal = Double.valueOf(szText).doubleValue();
                    if ( dblVal<Integer.MIN_VALUE) {
                      ValError = C_ZUKLEIN;
                    }
                    if ( dblVal>Integer.MAX_VALUE) {
                      ValError = C_ZUGROSS;
                    }
                }
                catch (NumberFormatException e2) {
                    // Hier könnte noch eine genauere Abfrage integriert werde,
                    // ob die Zahl nicht zu groß für den int-Bereich ist
                    // System.err.println(e);
                    ValError = C_KEINEZAHL;
                    intVal = 0;
                    result = false;
                }
                intVal = 0;
                result = false;
            }
        }
        return result;
    } // IVal



    /**
     * getIValResult
     * @return int iIVal
     * @param none
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use gibt den Wert der Konvertierung aus, oder den Fehlerwert Example
     * @see #getIValError
     * @see #setIValError
     */
    public static int getIValResult() {
       return intVal;
    }




     // Double
    /**
     * LVal
     * @return boolean StringIsLong
     * @param String szText
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Ausgabe des Konvertierten String als long Wert Example
     * @see #getLValError
     * @see #getLValResult
     */
    public static boolean DVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(szText); // neues Objekt
        s=s.replace(',' , '.');  // komma to point
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            dblVal = 0;
            result = false;
        }
        else {
            try {
                dblVal = Double.valueOf(szText).doubleValue();
                ValError = 0;
            }
            catch (NumberFormatException e) {
                ValError = C_KEINEZAHL;
                dblVal = 0;
                result = false;
            }
        }
        return result;
    } // LVal



    /**
     * getDValResult
     * @return double DVal
     * @param none
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use gibt den Wert der Konvertierung aus, oder den Fehlerwert Example
     * @see #getDValError
     * @see #setDValError
     */
    public static double getDValResult() {
       return dblVal;
    }




}  // CBasis
