Avatar billede seifmo3ed Nybegynder
29. januar 2007 - 12:08 Der er 3 kommentarer

java programmet mangler de rigtige klasser .

jeg har lavet et program! men fandt ud af jeg ikke brugte de rigtige klasser! de rigtige klasser kommer her:



1. Class Programming2Student

Create a class Programming2Student which has private fields for first name, surname, student’s ID number, Labs Mark, Assignment1 Mark, Assignment2 Mark, and Final Exam Mark. In addition to constructor(s) and get and set methods, you also have to specify the following methods:

public boolean passed() – which returns true, if the student passed the unit and false otherwise.
public String getGrade() – returns the grade of a student
public boolean isBefore(Programming2Student p) – allows to compare full names of students lexicographically.
public String toString() – just returns a String representation of a student, which includes surname, first name, and student’s ID number.

2. Classes Viewer and InputForm

Create a class Viewer (extends JFrame), which opens the file “students.dat” (if the file does not exist the program must create it) and outputs information stored in the file in the following View Form:





All  Programming2Student objects stored in the file “students.dat” are displayed in JList with scrollbar. When you choose some element from the JList, information about corresponding person displays in the form. You can sort persons either by Full Name (lexicographically) or by Total Mark clicking appropriate radio buttons. You also can delete an item from the JList by clicking the Delete button. You can undo the last deleting by clicking Undo button. If you close the form, current information will be written to “persons.dat” file.

To edit marks in Lab mark, Assignment1 Mark, Assignment2 Mark, Final Exam Mark  text fields you just need to click the “Edit Marks” button in which case the four mentioned fields become editable and label on the pressed button changes from “Edit Marks” to “Done”.



After you finish editing marks you can click the “Done” button – fields will become no editable again, and the label on the button will change back to “Edit Marks”.

To add new student to the form you must click the “Create Entry” button in the View Form. In this case the following modal JDialog “Input Form” appears on the screen (class InputDialog extending JDialog), and you can add a new Pogramming2 Student by filling the text fields in the form.




If everything is correct click Write, otherwise click Cancel. In both cases all text fields will become clear, but in the first case the information entered is used to create a Programming2Student object and is displayed in the View form, in the second case is discarded.
Clicking the Close button or x-button of the “Input Form” makes the dialog invisible, and all the changes made are displayed in the “View Form”.


All exceptional situations must be handled appropriately.

All created classes should be in a package called yourFirst-name followed by Last-Name, followed by the course code. For example, Feras Dabous would create a package called FerasDabousCS311.
***********************************
***********************************
  men her er hvad jeg reelt har kodet!

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


class Programming2Student implements Serializable
{
    private String firstname;
    private String surname;
    private String stdidno;
    private float labmark;
    private float asg1mark;
    private float asg2mark;
    private float finalmark;
   

    Programming2Student(EntryDlg obj)
    {
           

        firstname=obj.txtname.getText();;
        surname=obj.txtsurname.getText();
        stdidno=obj.txtID.getText();
        labmark=0;
        asg1mark=0;
        asg2mark=0;
        finalmark=0;

    }
    public void writeToFile()
    {
        try{
            File f=new File ("filename.ser");
            if(!f.exists())
            {
                f.createNewFile() ;
            }
            DataInputStream din=new DataInputStream(new FileInputStream(f));
            // fin=new FileInputStream(f);
            int counter=0;
            while(din.available()>0)
            {
                String ss=din.readLine();
                counter++;
            }
            DataOutputStream dout=new DataOutputStream(new FileOutputStream(f,true));

            String str=Integer.toString(counter)+";;"+stdidno+";;"+firstname+" "+surname+";;"+String.valueOf(labmark)+";;"+String.valueOf(asg1mark)+";;"+String.valueOf(asg2mark)+";;"+String.valueOf(finalmark)+";;\n";
            dout.writeBytes(str);
        }catch(Exception e){System.out.println(e);}

    }
    public static void main(String s[])
    {
       
        StdInfoViewer x=new StdInfoViewer();
        x.intComponent();
       

    }

    public void print()
    {
        System.out.println(firstname);
       
    }


}


class StdInfoViewer extends JFrame implements ActionListener,ListSelectionListener
{
    private JList viewList;
    private JScrollPane jScroll;
    private javax.swing.JButton cmdClose;
    private javax.swing.JButton cmdDelete;
    private javax.swing.JButton cmdEditMarks;
    private javax.swing.JButton cmdEntry;
    private javax.swing.JButton cmdUndoDelete;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JList jList1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JRadioButton radioSortByName;
    private javax.swing.JRadioButton radioTotalMark;
    private javax.swing.JTextField txtASg1;
    private javax.swing.JTextField txtAsg2;
    private javax.swing.JTextField txtFinal;
    private javax.swing.JTextField txtGrade;
    private javax.swing.JTextField txtID;
    private javax.swing.JTextField txtLabMark;
    private javax.swing.JTextField txtName;
    private javax.swing.JTextField txtSurname;
    private javax.swing.JTextField txtTotal;
    private javax.swing.ButtonGroup btnGrp;
    EntryDlg obj=new EntryDlg(this);
    String arr[]=new String[1000];
    String arrAll[]=new String[1000];

    int undoPos=-1;
    String undoStr="";
    public void intComponent()
    {
        viewList=new JList();
        jScroll=new JScrollPane();
        cmdDelete = new javax.swing.JButton();
        cmdUndoDelete = new javax.swing.JButton();
        cmdEntry = new javax.swing.JButton();
        cmdEditMarks = new javax.swing.JButton();
        cmdClose = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        txtName = new javax.swing.JTextField();
        txtSurname = new javax.swing.JTextField();
        txtID = new javax.swing.JTextField();
        txtLabMark = new javax.swing.JTextField();
        txtASg1 = new javax.swing.JTextField();
        txtAsg2 = new javax.swing.JTextField();
        txtFinal = new javax.swing.JTextField();
        txtTotal = new javax.swing.JTextField();
        txtGrade = new javax.swing.JTextField();
        radioSortByName = new javax.swing.JRadioButton();
        radioTotalMark = new javax.swing.JRadioButton();
        btnGrp = new javax.swing.ButtonGroup();
       

        getContentPane().setLayout(null);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScroll.setViewportView(viewList);
        getContentPane().add(jScroll);
        jScroll.setBounds(10, 10, 230, 230);


        cmdDelete.setText("Delete");
        getContentPane().add(cmdDelete);
        cmdDelete.setBounds(403, 10, 100, 23);

        cmdUndoDelete.setText("Undo Delete");
        getContentPane().add(cmdUndoDelete);
        cmdUndoDelete.setBounds(403, 40, 100, 23);

        cmdEntry.setText("Create Entry");
        getContentPane().add(cmdEntry);
        cmdEntry.setBounds(403, 70, 100, 23);

        cmdEditMarks.setText("Edit Marks");
        getContentPane().add(cmdEditMarks);
        cmdEditMarks.setBounds(403, 100, 100, 23);

        cmdClose.setText("Close");
        getContentPane().add(cmdClose);
        cmdClose.setBounds(403, 130, 100, 23);


        jPanel1.setLayout(new java.awt.GridLayout(9, 0));

        jLabel1.setText("Name");
        jPanel1.add(jLabel1);

        jLabel2.setText("Surname");
        jPanel1.add(jLabel2);

        jLabel3.setText("ID");
        jPanel1.add(jLabel3);

        jLabel4.setText("Lab Mark");
        jPanel1.add(jLabel4);

        jLabel5.setText("Asg1 Mark");
        jPanel1.add(jLabel5);

        jLabel6.setText("Asg2 Mark");
        jPanel1.add(jLabel6);

        jLabel7.setText("Final Exam Mark");
        jPanel1.add(jLabel7);

        jLabel8.setText("Total Mark");
        jPanel1.add(jLabel8);

        jLabel9.setText("Grade");
        jPanel1.add(jLabel9);

        getContentPane().add(jPanel1);
        jPanel1.setBounds(40, 270, 150, 230);

        jPanel2.setLayout(new java.awt.GridLayout(9, 0));

        jPanel2.add(txtName);

        jPanel2.add(txtSurname);

        jPanel2.add(txtID);

        jPanel2.add(txtLabMark);

        jPanel2.add(txtASg1);

        jPanel2.add(txtAsg2);

        jPanel2.add(txtFinal);

        jPanel2.add(txtTotal);

        jPanel2.add(txtGrade);


        txtName.setEnabled(false);
        txtSurname.setEnabled(false);
        txtID.setEnabled(false);
        txtLabMark.setEnabled(false);
        txtASg1.setEnabled(false);
        txtAsg2.setEnabled(false);
        txtFinal.setEnabled(false);
        txtTotal.setEnabled(false);
        txtGrade.setEnabled(false);

        getContentPane().add(jPanel2);
        jPanel2.setBounds(220, 270, 140, 200);

        btnGrp.add(radioSortByName);
        radioSortByName.setText("Sort by Full Name");
        radioSortByName.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        radioSortByName.setMargin(new java.awt.Insets(0, 0, 0, 0));
        getContentPane().add(radioSortByName);
        radioSortByName.setBounds(380, 330, 150, 15);

        btnGrp.add(radioTotalMark);
        radioTotalMark.setText("Sort by the Total Mark");
          radioTotalMark.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        radioTotalMark.setMargin(new java.awt.Insets(0, 0, 0, 0));
        getContentPane().add(radioTotalMark);
        radioTotalMark.setBounds(380, 370, 160, 15);
       



        setSize(600,600);
        setVisible(true);

   

        cmdDelete.addActionListener(this);
       
        cmdUndoDelete.addActionListener(this);
        cmdEntry.addActionListener(this);
        cmdEditMarks.addActionListener(this);
        cmdClose .addActionListener(this);
        radioSortByName.addActionListener(this);
        radioTotalMark.addActionListener(this);

        viewList.addListSelectionListener(this);



                addWindowListener(new WindowAdapter(){
            public void windowOpened(WindowEvent e){
                /*try{
                File f=new File("E://filename.ser");
                ObjectInput in=new ObjectInputStream(new FileInputStream(f));
                Object o;
               
               
                        o=in.readObject();
                        o=in.readObject();
                        Programming2Student ob=(Programming2Student)o;
                        ob.print();
                DataInputStream din=new DataInputStream(new FileInputStream(f));
                String arr[]=new String[1000];
                int i=0;
                while(din.available()>0)
                    {
                        String str=din.readLine();
                        String ss[]=str.split("##");
                        arr[i]="IdNo:"+ss[1];
                        i++;
                    }
                   
                    viewList.setListData(arr);


                }catch(Exception ex){System.out.println(ex);}*/
                updateDetails();
            }});


    }
    public void valueChanged(ListSelectionEvent e)
        {
        try{
            String value=(String)viewList.getSelectedValue();
       
            //System.out.println(value);
            String arrId[]=value.split(";");
            for (int i=0;i<arrAll.length ;i++ )
            {
                   
                String arrAllSpl[]=arrAll[i].split(";;");
               
                    //System.out.println("xxx"+arrAllSpl[1]);

                String chk=arrId[0].substring(5);
                                //System.out.println("ppp"+chk);
//                arrAllSpl
                if ((arrAllSpl[1].trim()).equals(chk))
                {
                   
                    txtName.setText(arrAllSpl[2]);
                    txtSurname.setText(arrAllSpl[2]);
                    txtID.setText(arrAllSpl[1]);
                    txtLabMark.setText(arrAllSpl[3]);
                    txtASg1.setText(arrAllSpl[4]);
                    txtAsg2.setText(arrAllSpl[5]);
                    float result,lbm,asg1m,asg2m,finalm;
                    lbm=Float.parseFloat(arrAllSpl[3]);
                    asg1m=Float.parseFloat(arrAllSpl[4]);
                    asg2m=Float.parseFloat(arrAllSpl[5]);
                    finalm=Float.parseFloat(arrAllSpl[6]);
                    result=lbm+asg1m+asg2m+finalm;
                    txtFinal.setText(arrAllSpl[6]);
                    txtTotal.setText(String.valueOf(result));

                        String rd="";
                        if(result<40)
                        {
                            rd="NN";
                        }
                        else if((result>=40 && result<=50) || (lbm+asg1m+asg2m)<25 || (finalm<25))
                        {
                            rd="MN";
                        }
                        else if((result>=50 && result<=60) && (lbm+asg1m+asg2m)>=25 && (finalm>=25))
                        {
                            rd="P";
                        }
                        else if ((result>=60 && result<=70) && (lbm+asg1m+asg2m)>=25 && (finalm>=25))
                        {

                            rd="C";
                        }
                        else if ((result>=70 && result<=80) && (lbm+asg1m+asg2m)>=25 && (finalm>=25))
                        {
                            rd="D";
                        }
                        else if(result>=80)
                        {
                            rd="HD";
                        }
                        txtGrade.setText(rd);


                   
                }
            }
           

        }catch(Exception ee){System.out.println(ee);}

        }

    public void updateDetails()
    {
        try{
                File f=new File("filename.ser");
                /*ObjectInput in=new ObjectInputStream(new FileInputStream(f));
                Object o;
               
               
                        o=in.readObject();
                        o=in.readObject();
                        Programming2Student ob=(Programming2Student)o;
                        ob.print();*/
                DataInputStream din=new DataInputStream(new FileInputStream(f));
                arrAll=new String[1000];
                arr=new String[1000];
                int i=0;
                while(din.available()>0)
                    {
                        String str=din.readLine();
                        arrAll[i]=str;
                        String ss[]=str.split(";;");
                        arr[i]="IdNo:"+ss[1]+";"+ss[2];
                        i++;
                    }

                   
                    viewList.setListData(arr);


                }catch(Exception ex){System.out.println(ex);}
    }

    public void actionPerformed(ActionEvent e)
    {
        System.out.println(e.getActionCommand());
   
        if (e.getActionCommand().equals("Create Entry"))
        {
            obj=new EntryDlg(this);
            obj.intComponent();
            updateDetails();

        }
        if(e.getActionCommand().equals("Edit Marks"))
        {

        String value=(String)viewList.getSelectedValue();
        if(value!=null)
            {

            cmdEditMarks.setText("Done");
           
       

        txtLabMark.setEnabled(true);
        txtASg1.setEnabled(true);
        txtAsg2.setEnabled(true);
        txtFinal.setEnabled(true);
        viewList.setEnabled(false);
        cmdDelete.setEnabled(false);
        cmdUndoDelete.setEnabled(false);
        cmdEntry.setEnabled(false);
        cmdClose.setEnabled(false);
            }
            else
                JOptionPane.showMessageDialog(null, "Please Select a Student","alert", JOptionPane.ERROR_MESSAGE);

       
        }
        else if(e.getActionCommand().equals("Done"))
        {
            int x=-1;


            try{
                if(Integer.parseInt(txtLabMark.getText())<0 || Float.parseFloat(txtLabMark.getText())>10)
               
                {
                    x=1;
                    JOptionPane.showMessageDialog(null, "Enter a value between 0 to 10","alert", JOptionPane.ERROR_MESSAGE);

                }
                if(Integer.parseInt(txtASg1.getText())<0 || Integer.parseInt(txtASg1.getText())>15)
                {x=1;
                    JOptionPane.showMessageDialog(null, "Enter a value between 0 to 15","alert", JOptionPane.ERROR_MESSAGE);
                }
                if(Integer.parseInt(txtAsg2.getText())<0 || Integer.parseInt(txtAsg2.getText())>25)
                {x=1;
                    JOptionPane.showMessageDialog(null, "Enter a value between 0 to 25","alert", JOptionPane.ERROR_MESSAGE);
                }
                if(Integer.parseInt(txtFinal.getText())<0 || Integer.parseInt(txtFinal.getText())>50)
                {x=1;
                    JOptionPane.showMessageDialog(null, "Enter a value between 0 to 50","alert", JOptionPane.ERROR_MESSAGE);
                }
               

            if(x!=1)
                {
            File f=new File("filename.ser");
           
           
            String idno=txtID.getText().trim();
            int j=-1;
            for(j=0;j<arrAll.length;j++)
                {
                    String arrVal[]=arrAll[j].split(";;");
                       
                        if(arrVal[1].equals(idno))
                        {
                                break;
                               
                        }
                }
           



                    String linetoWrite=Integer.toString(j)+";;"+txtID.getText()+";;"+txtSurname.getText()+";;"+txtLabMark.getText()+";;"+txtASg1.getText()+";;"+txtAsg2.getText()+";;"+txtFinal.getText()+";;";
                    arrAll[j]=linetoWrite;
                    DataOutputStream dout=new DataOutputStream(new FileOutputStream(f));
                    for(int k=0;k<arrAll.length;k++)
                    {
                        if(arrAll[k]!=null)
                        dout.writeBytes(arrAll[k]+"\n");
                        else
                        break;
                    }
                   
   



                cmdEditMarks.setText("Edit Marks");
                txtLabMark.setEnabled(false);
                txtASg1.setEnabled(false);
                txtAsg2.setEnabled(false);
                txtFinal.setEnabled(false);
                viewList.setEnabled(true);
               
                cmdDelete.setEnabled(true);
                cmdUndoDelete.setEnabled(true);
                cmdEntry.setEnabled(true);
                cmdClose.setEnabled(true);
               
                }
               
            }
            catch(NumberFormatException ex){JOptionPane.showMessageDialog(null, "Enter a valid Number","alert", JOptionPane.ERROR_MESSAGE); }
            catch(Exception ex){System.out.println(ex);}
        }
        else if(e.getActionCommand().equals("Delete"))
        {
                try{
                File f=new File("filename.ser");
                String idno=txtID.getText().trim();
                int j=-1;
                for(j=0;j<arrAll.length;j++)
                {
                    String arrVal[]=arrAll[j].split(";;");
                       
                        if(arrVal[1].equals(idno))
                        {
                                break;
                               
                        }
                }
            undoPos=j;
            undoStr=arrAll[j];
            int del=-1;
            for(del=j;del<arrAll.length;del++)
            {
                if(arrAll[del]!=null)
                    arrAll[j]=arrAll[j+1];
                else
                    break;
            }
            arrAll[del-1]=null;
            DataOutputStream dout=new DataOutputStream(new FileOutputStream(f));
                    for(int k=0;k<arrAll.length;k++)
                    {
                        if(arrAll[k]!=null)
                        dout.writeBytes(arrAll[k]+"\n");
                        else
                        break;
                    }
                dout.close();

                }catch(Exception edel){}
                updateDetails();

        }
        else if(e.getActionCommand().equals("Undo Delete"))
        {
            try{
            File f=new File("filename.ser");
            int k=-1;
            for(k=0;k<arrAll.length;k++)
                    {
                        if(arrAll[k]==null)
                        break;
                    }
            if (undoPos!=-1)
            {
                for (k=k;k>undoPos;k-- )
                {
                    arrAll[k]=arrAll[k-1];
                }
                arrAll[undoPos]=undoStr;
                undoPos=-1;
            }
                DataOutputStream dout=new DataOutputStream(new FileOutputStream(f));
                    for(k=0;k<arrAll.length;k++)
                    {
                        if(arrAll[k]!=null)
                        dout.writeBytes(arrAll[k]+"\n");
                        else
                        break;
                    }
                    dout.close();
                    updateDetails();
            }catch(Exception eundo){}
        }
        else if (e.getActionCommand().equals("Close"))
        {
            System.exit(0);
        }
    }
    public boolean checkID(String id)
    {
        updateDetails();
        int x=-1;
        for (int i=0;i<arrAll.length ;i++ )
            {
                   
                String arrAllSpl[]=arrAll[i].split(";;");
               
                    //System.out.println("xxx"+arrAllSpl[1]);

               
                                //System.out.println("ppp"+chk);
//                arrAllSpl
                if ((arrAllSpl[1].trim()).equals(id))
                {
                    JOptionPane.showMessageDialog(null, "Student Id exists","alert", JOptionPane.ERROR_MESSAGE);
                    x=0;
                    break;

                }
                else
                    x=1;   
            }
            if(x==1)
                return true;
            else
                return false;
    }


   
}

class EntryDlg extends JDialog implements ActionListener
{
javax.swing.JTextField txtID;
    javax.swing.JTextField txtname;
    javax.swing.JTextField txtsurname;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private JButton cmdSave;
    private JPanel p;
    StdInfoViewer obj;

    EntryDlg(StdInfoViewer x)
    {
        obj=x;

    }

    public void intComponent()
    {
            txtID=new javax.swing.JTextField();
            txtname=new javax.swing.JTextField();
            txtsurname=new javax.swing.JTextField();
            jLabel1=new javax.swing.JLabel("ID");
            jLabel2=new javax.swing.JLabel("Name");
            jLabel3=new javax.swing.JLabel("Surname");
            cmdSave=new JButton("Save");

        p=new JPanel();
        GridLayout g=new GridLayout(3,2);
        // p.setBounds(0,0,100,200);

        p.setLayout(g);
        p.add(jLabel1);
        p.add(txtID);
        p.add(jLabel2);
        p.add(txtname);
        p.add(jLabel3);
        p.add(txtsurname);

       

        getContentPane().setLayout(null);   
        getContentPane().add(p);

          p.setBounds(0,0,250,100);
                  getContentPane().add(cmdSave);
                cmdSave.setBounds(20,120,80,30);

        setSize(300,300);
        setVisible(true);

        cmdSave.addActionListener(this);

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){

                obj.updateDetails();
               
            }});


    }
   
    public void actionPerformed(ActionEvent e)
    {Programming2Student objToWrite=new Programming2Student(this);
        if(e.getActionCommand().equals("Save"))
        {
            try {
                if(obj.checkID(txtID.getText()))
                {
                   
                    objToWrite.writeToFile();
                    obj.updateDetails();
                    txtID.setText("");
                    txtname.setText("");
                    txtsurname.setText("");
                }
            } catch (Exception ex) {
                objToWrite.writeToFile();
                obj.updateDetails();
                    txtID.setText("");
                    txtname.setText("");
                    txtsurname.setText("");
//                System.out.println(e);
            }

        }
    }
}
Avatar billede windcape Praktikant
29. januar 2007 - 12:17 #1
Du glemte at skrive hvad problemet / fejlmeddelserne var.
Avatar billede seifmo3ed Nybegynder
29. januar 2007 - 12:25 #2
jamen, egentlig den kommer ikke med de rigtige karater (marks)!!! fordi de rigtige klasser ikke er der! hved hvad der gaar galt!
Avatar billede windcape Praktikant
29. januar 2007 - 12:39 #3
Hvis dine class ikke er der skal du jo enten tilføje dem i din classpath, eller i din package, (og også i din jar).

Hvis du slet ikke har dem, må du jo hellere få dem kodet :p
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester