Avatar billede krukken Mester
03. maj 2004 - 18:46 Der er 40 kommentarer og
1 løsning

Graf i Java

Jeg bruger en graf i JFrame. Den skal ligger på en JPanel. Hvordan gør jeg det? Den skal modtage et antal data(double) også bare udskrive en graf over dem i den rækkefølge. Det behøver bestemt ikke at være noget avanceret, bare man kan se værdi for hver værdi. Altså må X-aksen godt gå fra 0 - antal værdier, men y-aksen skal gå fra 0 - 100.
Avatar billede arne_v Ekspert
03. maj 2004 - 18:49 #1
Mit bedste råd vil være at find enoget færdigt.

Måske http://www.jfree.org/jfreechart/index.html
Avatar billede _carsten Nybegynder
03. maj 2004 - 22:50 #2
Jeg ved ikke om dette er mere simpelt, men du kan jo kigge på det

Tegne arbejdet foregår i class DrawArea.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Line2D;
import javax.swing.JPanel;

public class DrawGraf extends javax.swing.JFrame {
   
    public DrawGraf() {
        initComponents();
       
        drawArea = new DrawArea();
        getContentPane().add(drawArea, java.awt.BorderLayout.CENTER);
        setSize(700,700);
    }
   
    private void initComponents() {
        buttonPanel = new javax.swing.JPanel();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getContentPane().add(buttonPanel, java.awt.BorderLayout.SOUTH);

        pack();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new DrawGraf().show();
    }
   
    private javax.swing.JPanel buttonPanel;
    private DrawArea drawArea;
   
   
    class DrawArea extends JPanel{
        public DrawArea(){
            xP = new int[]{100,125,150,200,250,280,340,400,470,630};
            yP = new int[]{150,250,350,450,475,400,350,250,100,75};
            xdP = new double[xP.length];
            ydP = new double[xP.length];
           
            for(int i = 0; i < xP.length; i++){
                xdP[i] = (double)xP[i] + 10.25;
                ydP[i] = (double)yP[i] + 10.25;
            }
        }
       
        public void paint(Graphics g){
            g.drawString("Y", 47, 45);
            g.drawLine(50, 50, 50, 550); // line Y
            g.drawString("X", 555, 554);
            g.drawLine(50, 550, 550,550); // line X
           
            for(int i = 50; i < 550; i += 50){
                g.drawLine(47, i , 53, i);
                g.drawLine(50+i, 553 ,50+ i, 547);
            }
           
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.RED);
           
            // Den lidt simple, med int
            g2.drawPolyline(xP, yP, 10);
           
            // Den lidt kringlede, med double
            Line2D.Double d2 = new Line2D.Double();
            g2.setColor(Color.GREEN);
            for(int i = 0; i < xP.length - 1; i++){
                d2.setLine(xdP[i], ydP[i], xdP[i + 1],ydP[i + 1]);
                g2.draw(d2);
            }

        }
       
        private int[] xP, yP;
        private double[] xdP, ydP;
    }
}
Avatar billede krukken Mester
04. maj 2004 - 22:39 #3
drawArea = new DrawArea() hvor kommer den fra?
Avatar billede _carsten Nybegynder
04. maj 2004 - 22:44 #4
Skyldes at jeg har lavet DrawArea som en inner class

"drawArea" er referencen til klassen den indre klasse DrawArea som jeg laver en ny instance af

Men du kan bare flytte den udenfor klassen DrawGraf, hvis det giver mere logik for dig
Avatar billede _carsten Nybegynder
04. maj 2004 - 22:54 #5
Er du med på hvad jeg mener ????
Avatar billede krukken Mester
04. maj 2004 - 22:54 #6
Jeg har fjernet din mainen fra din klasse og prøve at lave et objekt af din klasse i den klasse jeg forvejen har, men hvorfor giver:

DrawGraf drawGraf = new drawGraf();

giver det en fejl når jeg har compilet din klasse. Burde jeg så ikke kunne lave et objekt - når de nu ligger i samme bibliotek?
Avatar billede arne_v Ekspert
04. maj 2004 - 22:56 #7
d!=D ?
Avatar billede _carsten Nybegynder
04. maj 2004 - 22:58 #8
Ha - den var jeg godt længe om at fange

DrawGraf drawGraf = new DrawGraf();

ikke
DrawGraf drawGraf = new drawGraf();
Avatar billede krukken Mester
04. maj 2004 - 23:03 #9
ahhh - feel stupid
Avatar billede krukken Mester
04. maj 2004 - 23:21 #10
Hvordan tilføjer jeg så drawGraf til min JFrame?

getContentPane().add(drawGraf, BorderLayout.NORTH);

det gider en exception om at jeg ikke kan adde et windows til en container
Avatar billede _carsten Nybegynder
04. maj 2004 - 23:29 #11
Du kan ikke adde en JFrame til en JFrame (det tvivler jeg på ihvertfald, har aldrig prøvet)

Du skal kun adde DrawArea til din JFrame
Avatar billede _carsten Nybegynder
04. maj 2004 - 23:31 #12
public class DinJFrame extends javax.swing.JFrame {
  public DinJFrame(){
        drawArea = new DrawArea();
        getContentPane().add(drawArea, java.awt.BorderLayout.CENTER);
        setSize(700,700);
  }


  private DrawArea drawArea;
}



    class DrawArea extends JPanel{
        public DrawArea(){
            xP = new int[]{100,125,150,200,250,280,340,400,470,630};
            yP = new int[]{150,250,350,450,475,400,350,250,100,75};
            xdP = new double[xP.length];
            ydP = new double[xP.length];
           
            for(int i = 0; i < xP.length; i++){
                xdP[i] = (double)xP[i] + 10.25;
                ydP[i] = (double)yP[i] + 10.25;
            }
        }
       
        public void paint(Graphics g){
            g.drawString("Y", 47, 45);
            g.drawLine(50, 50, 50, 550); // line Y
            g.drawString("X", 555, 554);
            g.drawLine(50, 550, 550,550); // line X
           
            for(int i = 50; i < 550; i += 50){
                g.drawLine(47, i , 53, i);
                g.drawLine(50+i, 553 ,50+ i, 547);
            }
           
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.RED);
           
            // Den lidt simple, med int
            g2.drawPolyline(xP, yP, 10);
           
            // Den lidt kringlede, med double
            Line2D.Double d2 = new Line2D.Double();
            g2.setColor(Color.GREEN);
            for(int i = 0; i < xP.length - 1; i++){
                d2.setLine(xdP[i], ydP[i], xdP[i + 1],ydP[i + 1]);
                g2.draw(d2);
            }

        }
       
        private int[] xP, yP;
        private double[] xdP, ydP;
    }
Avatar billede krukken Mester
05. maj 2004 - 16:39 #13
Når jeg tilføjer det grafen på en panel bliver et kun en med lille firkant på omkring 1*1 cm. Hvordan gør jeg den større? Når man tilføjer TextField giver man jo en parameter med så det ved hvor bred den skal være. Den skal vel også på en eller anden måde fortælles hvor stort "grafens panel skal være.

Jeg har prøve at setSize af den Panel som den tilføjes men det virker ikke.
Avatar billede _carsten Nybegynder
05. maj 2004 - 16:43 #14
Det afhænger lidt af det layout du bruger, prøv at sætte layoutet til BorderLayout på dit panel

eller sæt layoutet til null setLayout(null); og setBounds(10,30,500,500); til at sætte størrelsen på grafpanelet
Avatar billede krukken Mester
05. maj 2004 - 16:58 #15
Det virker desværre ikke!
Avatar billede krukken Mester
05. maj 2004 - 17:01 #16
Jeg har lavet en klasse DrawGraf hvor koden fra Drawarea ligger. også gør jeg sådan her:

.......
private DrawGraf drawGraf = new DrawGraf();
..........

.................
JPanel graph = new JPanel();
graph.setLayout(new BorderLayout());
graph.add(drawGraf,BorderLayout.CENTER );
       
//Panel til tilfojer til JPANEL
getContentPane().setLayout(new BorderLayout());
getContentPane().add(graph,BorderLayout.NORTH );
getContentPane().add(control,BorderLayout.SOUTH);
getContentPane().setSize(700,700);
....................

Den sidste linie har heller ikke nogen betydning!
Avatar billede krukken Mester
05. maj 2004 - 17:03 #17
efter graph.setLayout(new BorderLayout()); har jeg selvfølgelig indsat graph.setSize(700,700);
Avatar billede _carsten Nybegynder
05. maj 2004 - 17:08 #18
Hvilket layout har du i klassen DrawGraf ??


Og ikke getContentPane().setSize(700,700); her, men sandsynligvis this.setSize(700,700);
Avatar billede krukken Mester
05. maj 2004 - 17:13 #19
Der har jeg ikke noget kun din kode altså:
class DrawArea extends JPanel{
        public DrawArea(){
            xP = new int[]{100,125,150,200,250,280,340,400,470,630};
            yP = new int[]{150,250,350,450,475,400,350,250,100,75};
            xdP = new double[xP.length];
            ydP = new double[xP.length];
           
            for(int i = 0; i < xP.length; i++){
                xdP[i] = (double)xP[i] + 10.25;
                ydP[i] = (double)yP[i] + 10.25;
            }
        }
       
        public void paint(Graphics g){
            g.drawString("Y", 47, 45);
            g.drawLine(50, 50, 50, 550); // line Y
            g.drawString("X", 555, 554);
            g.drawLine(50, 550, 550,550); // line X
           
            for(int i = 50; i < 550; i += 50){
                g.drawLine(47, i , 53, i);
                g.drawLine(50+i, 553 ,50+ i, 547);
            }
           
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.RED);
           
            // Den lidt simple, med int
            g2.drawPolyline(xP, yP, 10);
           
            // Den lidt kringlede, med double
            Line2D.Double d2 = new Line2D.Double();
            g2.setColor(Color.GREEN);
            for(int i = 0; i < xP.length - 1; i++){
                d2.setLine(xdP[i], ydP[i], xdP[i + 1],ydP[i + 1]);
                g2.draw(d2);
            }

        }
       
        private int[] xP, yP;
        private double[] xdP, ydP;
    }
Avatar billede _carsten Nybegynder
05. maj 2004 - 17:15 #20
Jeg mener den klasse DrawGraf du selv har lavet ?
Avatar billede krukken Mester
05. maj 2004 - 17:15 #21
this.setSize(700,700); virker altså heller ikke:-)
Avatar billede krukken Mester
05. maj 2004 - 17:17 #22
Jamen det er bare din DrawArea jeg har omdøbt:
class DrawGraf extends JPanel{

    private int[] xP, yP;
        private double[] xdP, ydP;
        public DrawGraf(){
            xP = new int[]{100,125,150,200,250,280,340,400,470,630};
            yP = new int[]{150,250,350,450,475,400,350,250,100,75};
            xdP = new double[xP.length];
            ydP = new double[xP.length];
           
            for(int i = 0; i < xP.length; i++){
                xdP[i] = (double)xP[i] + 10.25;
                ydP[i] = (double)yP[i] + 10.25;
            }
        }
       
        public void paint(Graphics g){
            g.drawString("Temperatur", 47, 45);
            g.drawLine(50, 50, 50, 550); // line Y
            g.drawString("Tid / sec.", 555, 554);
            g.drawLine(50, 550, 550,550); // line X
           
            for(int i = 50; i < 550; i += 50){
                g.drawLine(47, i , 53, i);
                g.drawLine(50+i, 553 ,50+ i, 547);
            }
           
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.RED);
           
            // Den lidt simple, med int
            g2.drawPolyline(xP, yP, 10);
           
            // Den lidt kringlede, med double
            Line2D.Double d2 = new Line2D.Double();
            g2.setColor(Color.GREEN);
            for(int i = 0; i < xP.length - 1; i++){
                d2.setLine(xdP[i], ydP[i], xdP[i + 1],ydP[i + 1]);
                g2.draw(d2);
            }

        }
       
       
    }
Avatar billede _carsten Nybegynder
05. maj 2004 - 17:30 #23
Du må have tilføjet nogle andre komponenter til den klasse hvor du adder DrawGraf, så der derved ikke er mere plads tilbage - ellers kan jeg ikke se hvad der er galt.

Hvis du følger stilen i min kommentar 03/05-2004 22:50:54 kan det kun virke, ellers prøv at bruge den som basis.

Har ikke tid de næste ca 3. timer.
Avatar billede krukken Mester
05. maj 2004 - 17:32 #24
okay - tak skal du havee:-)
Avatar billede krukken Mester
05. maj 2004 - 20:20 #25
Så er jeg faktisk ved at være i mål;-) Jeg har fået tegnet grafen og mangler kun en ting. Når jeg nu opdatere grafen virker det som om den tidligere graf ikke bliver slettet. Hvordan laver jeg det om, skal jeg bruge dobbeltbuffering?

Det mærkelig er nemlig at når jeg minimere mit vindue så forsvinder alt det jeg ikke ønsker skal være der - og det er ud som det skal!

Hvad skal jeg gøre?
Avatar billede _carsten Nybegynder
05. maj 2004 - 20:55 #26
1.
Du laver en metode i DrawGraf og initierer de to array xdP[] og ydP[] og kalder repaint()

noget a la

public void setTheseArrays(double[] a, double[] b){
    this.xdP = a;
    this.ydP = b;

    repaint();
}

2. dobbeltbuffering bør ikke være nødvendig, DrawGraf vil altid vise en graf
    udfra de to arrays, da vi overrider paint()

3. "forsvinder" ???? ikke helt med!
Avatar billede krukken Mester
05. maj 2004 - 21:10 #27
Jamen jeg tegnet en graf på min panel - men når jeg tegner en ny forsvinder den gamle ikke. Hvorfor ikke? Kan man ikke kaldet noget i stil med Invalidate() som i C#? Altså så man får gentegnet hele området?
Avatar billede krukken Mester
05. maj 2004 - 21:12 #28
Der bliver også tegnet noget af knapperne i graf-panellet - helt oppe i venstre hjørne. Det er vildt mærkeligt! Men det hele ser perfekt ud hvis jeg minimere vinduet og derefter maksismere det.
Avatar billede _carsten Nybegynder
05. maj 2004 - 21:18 #29
DrawGraf vil altid vise en graf udfra de to arrays, da vi overrider paint()

Så du skal altså ændre indholdet af de 2 arrays, hvis indholdet ændres bliver den gamle graf fjernet og den nye tegnet

invalidate() findes, men har ingen funktion som vedrører dette.

Smid evt. hele koden her
Avatar billede krukken Mester
05. maj 2004 - 21:25 #30
har du en mail? SÅ kan jeg sende det til dig - så kan du selv prøv at køre det. DU skal du have flere filer - da det bliver forbundet over rmi:-)
Avatar billede _carsten Nybegynder
05. maj 2004 - 21:29 #31
Ja, men jeg er egentlig ikke meget for at slippe den løs her, modtager rigelig med mails

Kan du ikke bare poste den klasse som initierer DrawGraf, så har jeg sikkert nok - formoder jeg ??
Avatar billede krukken Mester
05. maj 2004 - 21:50 #32
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.awt.event.*;
import javax.swing.Timer;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Line2D;
import javax.swing.JPanel;


public class UserInterface extends JFrame implements ActionListener
{
    private JTextField channel,name,adminname,adminpassword,numbers;
    private JButton login,update,vis;
    private JPanel p3 = new JPanel();
    private ServerInterface Server;
    private Timer timer;
    private int ch = 1;
    private int ARRAY_SIZE = 120;
    private DrawArea drawArea = new DrawArea();
    private    double temp[] = new double[ARRAY_SIZE];
   
    public UserInterface(ServerInterface s)
    {
        super();
        Server = s;
        setTitle("Thermo Surveillance System");
       
        //Panel til input/output felter
        JPanel edit = new JPanel();
        edit.setLayout(new GridLayout(4,1,5,5));
        edit.add(new JLabel("ChannelName:"));
        edit.add(name = new JTextField(8));
        edit.add(new JLabel("ChannelNummer"));
        edit.add(channel = new JTextField(8));
        edit.add(new JLabel("Username:"));
        edit.add(adminname = new JTextField(8));
        edit.add(new JLabel("Password:"));
        edit.add(adminpassword = new JTextField(8));
        edit.setBackground(Color.gray);
       
        //Panel til knapper
        JPanel buttom = new JPanel();
        buttom.setLayout(new GridLayout(3,1,5,5));
        buttom.add(login = new JButton("Login"));
        buttom.add(vis = new JButton("Vis Information"));
        buttom.add(update = new JButton("Skift Channel navn"));
        buttom.setBackground(Color.gray);
       
        //tilføjer buttom og edit til panel control
        JPanel control = new JPanel();
        control.setLayout(new BorderLayout());
        control.add(edit,BorderLayout.WEST);
        control.add(buttom,BorderLayout.EAST);
       
        //Panel til tilfojer til JPANEL
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(control,BorderLayout.SOUTH);
        getContentPane().add(drawArea, java.awt.BorderLayout.CENTER);
       
        //aktivere listener på knapperne
        login.addActionListener(this);
        update.addActionListener(this);
        vis.addActionListener(this);
        channel.addActionListener(this);
       
        //Create an starts timer
        timer = new Timer(30000,this);
        timer.start();
       
        //initiere
        channel.setText(""+ch);
        update.setEnabled(false);
        name.setEditable(false);
        try {
            name.setText(Server.getChannelName(ch));
            }
        catch (Exception a)
        {
              System.out.println("DatabaseService exception: " + a.getMessage());
                a.printStackTrace();
        }
    }
   
    public void actionPerformed(ActionEvent e)
    {   
        String Name = "BLANK";
        String message = "BLANK";       
               
        if(e.getSource() == update)
        {

            try {
                Name = name.getText();
                ch = Integer.parseInt(channel.getText());
                Server.setChannelName(ch,Name);
                    name.setText(Name);
                    }
                catch (Exception a) {
                  System.out.println("DatabaseService exception: " + a.getMessage());
                    a.printStackTrace();
                }
        }
       
        if(e.getSource() == vis)
        {

            try {
                ch = Integer.parseInt(channel.getText());
                message = Server.getChannelName(ch);
                    name.setText(message);
                    temp = Server.getTemperature(ch);               
                drawArea.setValues(temp);
                drawArea.repaint();
               
                    }
                catch (Exception a) {
                  System.out.println("DatabaseService exception: " + a.getMessage());
                    a.printStackTrace();
                }
        }
       
        if(e.getSource() == login)
        {
            if(login.getText() == "Logout")
                {
                        update.setEnabled(false);
                        name.setEditable(false);
                        login.setText("Login");
                }
                                       
                    if(adminpassword.getText().equals("123456")&& adminname.getText().equals("admin"))
                    {
                        adminpassword.setText("");
                        adminname.setText("");
                        if(login.getText() == "Login")
                        {
                            update.setEnabled(true);
                            name.setEditable(true);
                            login.setText("Logout");
                        }
                }       
        }
       
        if(e.getSource() == timer)
        {
            try {
                ch = Integer.parseInt(channel.getText());
                temp = Server.getTemperature(ch);               
                drawArea.setValues(temp);
                }
                catch (Exception a) {
                  System.out.println("DatabaseService exception: " + a.getMessage());
                    a.printStackTrace();
                }
           
           
           
        }           
    }
    class DrawArea extends JPanel{
    int Y_max = 120;
    int X_max = 120;
    int indryk = 50;
   
       
        public DrawArea(){
           
            xdP = new double[120];
            ydP = new double[120];
            for(int i = 0; i < xdP.length; i++)
                xdP[i] = i+indryk;
                 
        }
       
        public void setValues(double [] temp){
            this.ydP = temp;
            this.repaint();
        }
       
       
       
        public void paint(Graphics g){
            g.drawString("Temperatur", indryk-3, indryk-5);
            g.drawLine(indryk, indryk, indryk, X_max); // line Y
            g.drawString("Tid / 10 min", 2*X_max, X_max+4);
            g.drawLine(indryk, Y_max, 2*X_max,X_max); // line X
           
            //streger på y aksen og værdier
            for(int i = indryk,count = 0; i < X_max; i += 10){
                g.drawLine(indryk-3, i , indryk+3, i);
                g.drawString(""+(120-i),indryk-20, i+5);
                //g.drawLine(indryk+i, X_max+3 ,indryk+ i, X_max-3);
            }
          //Streger på x-aksen og værdier
            for(int i = 0; i < 2*X_max-indryk+10; i += 10 ){
                g.drawLine(indryk+i, X_max+3 ,indryk+ i, X_max-3);
            }
           
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.BLACK);
           
            // Den lidt simple, med int
            //g2.drawPolyline(xP, yP, 10);
           
            // Den lidt kringlede, med double
            Line2D.Double d2 = new Line2D.Double();
            g2.setColor(Color.RED);
            for(int i = 0; i < xdP.length - 1; i++){
                d2.setLine(xdP[i], X_max-(ydP[i]), xdP[i + 1],Y_max-(ydP[i + 1]));
                g2.draw(d2);
            }

        }
       
        //private int[] xP, yP;
        private double[] xdP, ydP;
    }
   
}
Avatar billede _carsten Nybegynder
06. maj 2004 - 08:49 #33
Min fejl - det er åbenbart nødvendigt at repainte hele JFramen ikke kun DrawGraf panelet

        public void setValues(double [] temp){
            this.ydP = temp;
            //this.repaint(); SKAL FJERNES
        }
       

        drawArea.repaint(); RETTES TIL repaint();
Avatar billede krukken Mester
06. maj 2004 - 10:39 #34
Det ændre ikke rigtig noget! Det virker på nøjagtig samme måde!
Avatar billede krukken Mester
06. maj 2004 - 10:49 #35
Jeg har oprettet en offentlig email. Hvis du skriver til theonlyone43221@hotmail.com - så sender jeg dig lige koden - så kan du selv se det ske. Gider du ikke lige at poste her når du har sendt mailen?
Avatar billede _carsten Nybegynder
06. maj 2004 - 10:51 #36
Fatter jeg ikke noget af, virker perfekt hos mig!

Følgende mailadresse virker en halv dags tid, så kigger jeg på det i weekenden, hvis det er godt nok, abcdefg123@mail.dk
Avatar billede krukken Mester
06. maj 2004 - 17:26 #37
Jeg er kommet hjem nu - og jeg kan altså sagtens køre klientprorgammet hos mig! du har stuben og serinterfacet i samme biblioket som klienten - og de er alle compilet?
Avatar billede _carsten Nybegynder
06. maj 2004 - 17:29 #38
Har lige mailet til dig - men glemte koden - den er på vej!
Avatar billede krukken Mester
06. maj 2004 - 18:40 #39
He he - det er sku helt perfekt:-) Gider du at ligge et svar?

Hvad lavede du om? Jeg kan se at det kun er Userinterface du har lavet noget om
Avatar billede _carsten Nybegynder
06. maj 2004 - 20:32 #40
Jeg har rettet UserInterface som jeg skrev i min kommentar 06/05-2004 08:49:41
:-)
Avatar billede krukken Mester
06. maj 2004 - 21:46 #41
Okay - det er sku mærkeligt, jeg prøvede det - og det virkede ikke! Men det er jo også lige meget nu hvor det virker. Men jeg undskylder alt besværet! Mange tak for hjælpen - du har ærligt fortjent dine point:-)
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