# Drei Linien durch Eingabe von Punkten in Koordinatensystem in eine Grafik zeichnen



## koddy013 (19. April 2010)

Hallo,

als newbie in Java, möchte ich 3 Linien jeweils pro Linie mit dem eingegebenen Koordinatensystem (je Linien mit 2 angegebenen Koordinatensystem für Anfang und Endpunkt) zeichnen.
Ich versuche mit Arrays diese Linie zu zeichnen, aber immerhin klappt bei mir nicht 

Hier ist die Code, wo die Linien durch ActionsListener button gezeichnet wurde.


```
private void DrawButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try
        {

            int[] coordinats1 = new int[3];
            coordinats1[0] = (int) Double.parseDouble(inputx1.getText());
            coordinats1[1] = (int) Double.parseDouble(inputy1.getText());
            coordinats1[2] = (int) Double.parseDouble(inputx2.getText());
            coordinats1[3] = (int) Double.parseDouble(inputy2.getText());
            
            int[] coordinats2 = new int[3];
            coordinats2[0] = (int) Double.parseDouble(inputx3.getText());
            coordinats2[1] = (int) Double.parseDouble(inputy3.getText());
            coordinats2[2] = (int) Double.parseDouble(inputx4.getText());
            coordinats2[3] = (int) Double.parseDouble(inputy4.getText());

            int[] coordinats3 = new int[3];
            coordinats3[0] = (int) Double.parseDouble(inputx5.getText());
            coordinats3[1] = (int) Double.parseDouble(inputy5.getText());
            coordinats3[2] = (int) Double.parseDouble(inputx6.getText());
            coordinats3[3] = (int) Double.parseDouble(inputy6.getText());


            JDesktopPane dreilinear = new DreiLinear(new Point(coordinats1[0], coordinats1[1]), new Point(coordinats1[2], coordinats1[3]));
            new DreiLinear(new Point(coordinats2[0], coordinats2[1]), new Point(coordinats2[2], coordinats2[3]));
            new DreiLinear(new Point(coordinats3[0], coordinats3[1]), new Point(coordinats3[2], coordinats3[3]));

            dreilinear.setBounds(0, 0, DesktopPanel.getWidth(), DesktopPanel.getHeight());
            DesktopPanel.setOpaque(true);
            DesktopPanel.add(dreilinear);
            dreilinear.setVisible(true);
           
            dreilinear.repaint();

         }


        catch (NumberFormatException e1)
        {
        }
    }
```


Und hier ist die Klasse DreiLinear


```
import java.awt.*;
import java.awt.Point;
import javax.swing.JDesktopPane;

public class DreiLinear extends JDesktopPane {

    private Point startCoordinats;
    private Point endCoordinats;

    public DreiLinear(Point startCoordinats, Point endCoordinats)
    {
        super();
        this.startCoordinats = startCoordinats;
        this.endCoordinats = endCoordinats;
        setVisible(true);
    }

    @Override
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        super.paint(g2d);
        g2d.drawLine(startCoordinats.x, startCoordinats.y, endCoordinats.x, endCoordinats.y);     //gerade Linie aus 2 Punkten zeichnen
    }
}
```

Wenn ich den ActionsListenerButton klicke, kommt der Grafik nicht. Ich vermute, ich habe irgendein Methode falsch geschrieben.
Kann jemand mir weisen oder helfen, wo ich Fehler geschrieben habe?

Ich habe auch gelesen, es gibt solche Setter und Getter Methode. Aber ich verstehe immer nicht, wann und wozu benutzt man diese Methode. Soll ich auch diese Methode hier benutzen?
Falls ich später den Program erweitern, z.B. noch mehrere Linien zeichen, soll ich diese Methode benutzen?

Danke im voraus.

Liebe Grüße,


----------



## Kai008 (19. April 2010)

Wieviele Threads willst du dazu noch aufmachen? Variablennamen werden klein und CamelCase geschrieben. Es ist sinnlos eine Variable zu einer Gleitkommazahl umzuwandeln und dann sofort zu einer Ganzzahl zu casten. Du setzt setVisible 2 mal true, was nichts bringt. (Allgemein nicht, da eine neue Instanz immer true ist). Statt coordinats1, coordinats2 und coordinats3 kannst du auch ein 2D-Array verwenden.

Änder mal den Background des JDesktopPane und setze sie Opaque. Dann siehst du, ob es daran oder an der Linie selbst liegt.


----------



## koddy013 (19. April 2010)

Hi,
sorry für mehrere Threads, da ich dachte, es handelt sich um ein neues Thema hier, deswegen mache ich neues Thread.

Danke auch für deine Antwort.
Also ich versuche mit 2D-Arrays hier anzuwenden, und die Code läuft wir folgt:


```
private void DrawButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try
        {

            double[][] coordinats = new double[6][2];
            coordinats[0][0] = Double.parseDouble(inputx1.getText());
            coordinats[0][1] = Double.parseDouble(inputy1.getText());
            coordinats[1][0] = Double.parseDouble(inputx2.getText());
            coordinats[1][1] = Double.parseDouble(inputy2.getText());
            
            coordinats[2][0] = Double.parseDouble(inputx3.getText());
            coordinats[2][1] = Double.parseDouble(inputy3.getText());
            coordinats[3][0] = Double.parseDouble(inputx4.getText());
            coordinats[3][1] = Double.parseDouble(inputy4.getText());

            coordinats[4][0] = Double.parseDouble(inputx5.getText());
            coordinats[4][1] = Double.parseDouble(inputy5.getText());
            coordinats[5][0] = Double.parseDouble(inputx6.getText());
            coordinats[5][1] = Double.parseDouble(inputy6.getText());

            JDesktopPane dreilinear = new DreiLinear(new Point(coordinats[][0], coordinats[][1]), new Point(coordinats[][0], coordinats[][1]));

            dreilinear.setBounds(0, 0, DesktopPanel.getWidth(), DesktopPanel.getHeight());
//            DesktopPanel.setOpaque(true);
            DesktopPanel.add(dreilinear);
            dreilinear.repaint();

        }
```

Aber es funktioniert immerhin nicht und ich mache noch Fehler in der Methode.
Weisst du, wo ich noch verbessern kannst?

Danke im voraus noch mal 

Liebe Grüße,


----------



## Kai008 (19. April 2010)

setOpaque(true) nicht auskommentieren, ich weiß nicht ob ein DesktopPane von Intialisierung aus Opaque ist, aber wenn es false ist sieht man den Background nicht. (Da man ja durchsieht.)
Pixel sind immer Ganzzahlen, also reicht es Integer zu benutzen. Statt den konstanten in den Arrayfeldangaben würde ich "variable Konstanten" verwenden.


```
private static final byte COORDINATS_LINE_0_START = 0;
private static final byte COORDINATS_LINE_0_END = 1;

private static final byte COORDINATS_LINE_1_START = 2;
private static final byte COORDINATS_LINE_1_END = 3;

private static final byte COORDINATS_LINE_2_START = 4;
private static final byteCOORDINATS_LINE_2_END = 5;

private static final byte X = 0;
private static final byte Y = 1;

coordinats[COORDINATS_LINE_0_START][X] = Double.parseDouble(inputx1.getText());
coordinats[COORDINATS_LINE_0_START][Y] = Double.parseDouble(inputy1.getText());
coordinats[COORDINATS_LINE_0_END][X] = Double.parseDouble(inputx2.getText());
coordinats[COORDINATS_LINE_0_END][Y] = Double.parseDouble(inputy2.getText());

coordinats[COORDINATS_LINE_1_START][X] = Double.parseDouble(inputx3.getText());
coordinats[COORDINATS_LINE_1_START][Y] = Double.parseDouble(inputy3.getText());
coordinats[COORDINATS_LINE_1_END][X] = Double.parseDouble(inputx4.getText());
coordinats[COORDINATS_LINE_1_END][Y] = Double.parseDouble(inputy4.getText());
 
coordinats[COORDINATS_LINE_2_START][X] = Double.parseDouble(inputx5.getText());
coordinats[COORDINATS_LINE_2_START][Y] = Double.parseDouble(inputy5.getText());
coordinats[COORDINATS_LINE_2_END][X] = Double.parseDouble(inputx6.getText());
coordinats[COORDINATS_LINE_2_END][Y] = Double.parseDouble(inputy6.getText());
```

Ich würde aber nicht primitive Dateitypen sondern Point-Instanzen speichern, weil man damit x und y auf einmal angeben bzw. übergeben kann.
Damit fällt schon mal die Hälfte der Felder weg. Außerdem die TextFields in ein Array speichern, dann kannst du das Array per Schleife füllen. Aber natürlich deine Entscheidung.

Kontrolliere aber erst mal, ob dein DesktopPane überhaupt angezeigt wird, indem du den Background eben wechselst.


----------



## koddy013 (19. April 2010)

Hallo,

über die set.Opaque(true) hast du recht. Es soll da sein.

Mit den Point-Instanzen, meinst du, ich soll diese Code in dem DreiLinear Klasse hinzufügen?


```
for (int i = 0; i < 6; i++)
        {
            g2d.draw(new Line2D.Double (startCoordinats[i][0], startCoordinats[i][1], endCoordinats[i+1][0], endCoordinats[i+1][1]));
        }
```

Sorry wenn ich zu viel fragt, da ich nur newbie bin. 

Liebe Grüße,


----------



## Kai008 (19. April 2010)

Nein, ich schätze auch dass das nicht funktionieren würde.
Ich meinte damit, dass du mit new eine neue Instanz der Klasse Point erzeugen kannst, um damit beide Koordinaten gleichzeitig zu übergeben. Oder du schreibst für die Linien selbst eine Klasse, dann kannst du alle 4 Punkte speichern.


----------



## koddy013 (19. April 2010)

Geht das so was wie folgendes?


```
Point [] points = new Point [6];
for (int i = 0; i < 6; i++) {
     points [i] = new Point();
     points [i].x = Double.parseDouble(inputx[i+1].getText());
     points [i].y = Double.parseDouble(inputy[i+1].getText());
}
for(int i=0; i<6; i++){
      JDesktopPane dreilinear = new DreiLinear();
      dreilinear.draw(new Line2D(points[i].x, points[i].y, points[i+1].x, points[i+1].y) {});
}
```


----------



## Kai008 (19. April 2010)

Prinzipiell schon, aber 1. solltest du das Pane vor der Schleife intialisieren, weil du ja nur eins brauchst. Das draw kannst du in der vorherigen Schleife aufrufen, dann brauchst du kein Array um die Points zu cachen. Ob x und y final ist oder nicht weiß ich nicht, übergebe die Variablen immer im Konstruktor. Außerdem beginnst du offenbar die Textfielder in dem Array-Feld 1 reinzuschreiben, wenn du bei 0 beginnst brauchst du kein "+ 1". Und wie gesagt, du brauchst nicht zu einer Gleitkommazahl umzuwandeln. Das Array für die Fields kannst du wieder um eine Dimension erhöhen.


----------



## koddy013 (19. April 2010)

ok... dann verändere ich auf Integer.parseInt();

prinzipiell läuft es schon, aber es wird kein 3 Linien gezeichnet, sondern immer nur eine Linie.
Und auch immer random gezeichnet, je mehr ich diese ActionsListenerButton klicke.

ich meine, z.B. meine gewünschte Linie ist von (x1,y1) zu (x2,y2) ; (x3,y3) zu (x4,y4). Aber es wird manchmal die unerwünschte Linie von (x2,y2) zu (x3,y3) gezeichnet.
Meine Meinung nach, liegt der Fehler auf die DreiLinear-Klasse.

Auf die DreiLinear-Klasse habe ich erweitert wie:


```
private Point startCoordinats [];
    private Point endCoordinats [];

    public DreiLinear (Point startCoordinats, Point endCoordinats)
    {
        super();
        setVisible(true);
    }
     
    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        super.paint(g2d);
        for (int i = 0; i < 6; i=i+2)
        {
        g2d.drawLine(startCoordinats[i].x, startCoordinats[i].y, endCoordinats[i+1].x, endCoordinats[i+1].y);//gerade Linie aus 2 Punkten zeichnen
        }
}}
```

Aber ich weiss immerhin nicht, was soll ich noch verändern.
Kannst du mir weisen?
Danke im voraus 

LG,


----------



## Kai008 (19. April 2010)

Oh man. ._.
Du übergibst ja nur 2 Koordinatenpunkte, daraus kann man nur eine Linie zeichnen. Davon machst du aber gleich 6 Stück. Leg doch nen Adder an, speichere die Koordinaten in ein Field und zeichne sie runter.


----------

