# Werte in Koordinatensystem zeichnen



## Gast (25. Sep 2007)

Hallo,

ich bin noch relativ neu im Java-Geschehen und habe folgendes Problem. Ich bin dabei ein Programm zu schreiben welches mittels einer API Messwerte ausliest, abspeichert und schlieslich in ein Koordinatensystem zeichnen soll.

Die Messwerte kann ich lesen und auch speichern. Auch ein Koordinatensystem hbae ich malen können nur im zusammenspiel zeigt er mir nichts an. Es tauchen während des ausführens/kompilierens keine Fehler auf und der Debugger läuft wie erwartet durch das Programm. Wenn ich alle Messwerte in der Konsole ausgeben lasse, glückt auch das. Was mache ich also falsch, dass ich keine Ausgabe bekomme?

Mein Programm ist in folgende 3 Dateien gesplittet: Main.java (Fenster, API, Benutzerauswahl), DrawPanel (um in Main ein DrawPanel-Objekt zu erzeugen und auch darauf zu malen) und Values.java (dort werden die Messdaten gespeichert).

DrawPanel.java

```
imports... [...]

public class DrawPanel extends JPanel {
    
    private static float PAD = 20, SPAD = 3, maxX = 10, maxY = 4;
    private static int startTime = 0, endTime = 10;
    private float inXa, inXb, inYa, inYb;
    private float x1, x2, y1, y2;
    private static Graphics g3;
    private static Graphics2D g2;
    
    public DrawPanel() {
    }
    
    public static Graphics getG() {
        return g3;
    }
    
    public void drawPoints(float inXa, float inYa, float inXb, float inYb) {
        int w = getWidth(), h = getHeight();
        float xInc = (float)(w - 2*PAD)/(2*maxX);
        float yInc = (float)(h - 2*PAD)/(2*maxY);
        Graphics2D g2 = (Graphics2D)g3;
        g2.setPaint(Color.red);
        g2.draw(new Line2D.Double(inXa*xInc + PAD, PAD + (maxY*2 - inYa)*yInc, inXb*xInc + PAD, PAD + (maxY*2 - inYb)*yInc)); 
    }
            
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g3 = g;
    }
    
    public void paintComponent(float inXa, float inYa, float inXb, float inYb){
        this.inXa = inXa;
        this.inXb = inXb;
        this.inYa = inYa;
        this.inYb = inYb;
    }    
}
```

Main.java

```
import try_02.DrawPanel;
import try_02.Values;

public class Main extends JFrame implements ActionListener, ItemListener, WindowListener {

    DrawPanel canvas = new DrawPanel ();

    public static void main(String[] args) {

        Main mainWindow = new Main ();

    }

    public Main() {
        
        super(" JAVA-Tool");

	setLayout(gridbag);

	addComponent(canvas, 1, 3, 5, 1, 25, 100, GridBagConstraints.BOTH,GridBagConstraints.CENTER);

        setVisible(true);

    }

    private void addComponent(Component component, int gridx, int gridy, int gridwidth, int gridheight, int weightx, int weighty, int fill, int anchor) {
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = gridx;
        constraints.gridy = gridy;
        constraints.gridwidth = gridwidth;
        constraints.gridheight = gridheight;
        constraints.weightx = weightx;
        constraints.weighty = weighty;
        constraints.fill = fill;
        constraints.anchor = anchor;
        constraints.ipadx = 2;
        constraints.ipady = 0;
        constraints.insets = new Insets(0, 0, 5, 0);
        gridbag.setConstraints(component, constraints);
        add(component);
    }

    public void actionPerformed(ActionEvent evt) {
        
        Object source = evt.getSource();

	if( source == field) {

		werte werden in values[i] gespeichert, jeder Punkt (X/Y) in eigenen array

                i=1;
                while (i < try_02.Values.getValueNumber() ) {
                      canvas.paintComponent(value[i-1].getX(),value[i-1].getY(),value[i].getX(),value[i].getY());
                      i++;
                }

		repaint();

   }
```

Natürlich habe ich jetzt - meines erachtens nach überflüssigen - Code weg gelassen.

Vielen Dank für eure Mühe


----------



## Gast2 (25. Sep 2007)

1. rufst du nie  drawPoint auf
2. warum sind alle atributte static
3. wie du deine paint Component überschreibst ist schwachsinnig
4. für was ist das repaint gedacht??


----------



## Guest (25. Sep 2007)

Danke schonmal.

drawPoint rufe ich eigtl hier auf:


```
public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g3 = g;
        drawPoints(inXa,inYa,inXb,inYb);
    }
```

Wieso das beim kopieren verloren ging ist mir schleierhaft. Enschuldigung.

Das repaint() ist dazu da um Änderungen an einer Combobox sowie 2 Textfeldern wirksam zu mache. Wie gesagt ist das nur ein Ausschnitt des gesamten Codes.

Was verstehst du unter Schwachsinn? Ich bin wie gesagt noch Neuling. Generell tue ich das aber damit alles mitwächst/schrumpft wenn der User das Fenster skaliert.


----------



## Gast2 (25. Sep 2007)

lass dir mal deine inXa,inYa,inXb,inYb ausgeben was die für werte haben

EDTI: du musst deine messpunkte in einem array speichern und dieses jedes mal bei paintComoponent aufrufen...sonst wirst du nie was sehen


----------



## Guest (26. Sep 2007)

Hallo,

ich bin mittlerweile soweit das ich einzelene Linien malen kann und diese auch dargestellt werden, im zusammenspiel funktioniert es dennoch nicht. Graphics g scheint nacher leer (null) zu werden, was sonst nie der Fall war. Das Fenster ist extrem ausgelastet und zeigt folglich garnichts mehr an.

Das überarbeitetete, nicht funktionsfähige, Werk:

Main.Java

```
Schleife zum einlesen der Werte (klappt wunderbar) {
                                    canvas.setNewPoint(rtime.getVal(), fvalue.getVal(), i);
                                    i++;
                         }
                        
                        canvas.setArrayLenght(try_02.Values.getValueNumber());
```

DrawPanel.Java

```
public class DrawPanel extends JPanel {
    
    private static float PAD = 20, SPAD = 3, maxX = 10, maxY = 4;
    private static int startTime = 0, endTime = 10, lenght = 0;
    private float inXa, inXb, inYa, inYb;
    private float x1, x2, y1, y2;
    public static Values[] point = new Values[100];
    
    /** Creates a new instance of DrawPanel */
    public DrawPanel() {
    }
    
    public void setNewPoint(float inX, float inY, int i) {
        point[i] = new Values();
        point[i].setX(inX);
        point[i].setY(inY); 
    }
    
    public static void setArrayLenght(int inLenght) {
        lenght = inLenght;
    }
    
    public void drawPoints(Graphics g) {
        int w = getWidth(), h = getHeight();
        float xInc = (float)(w - 2*PAD)/(2*maxX);
        float yInc = (float)(h - 2*PAD)/(2*maxY);
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.red);
        int i = 0;
        while( i < lenght ) {
            i++;
            g2.draw(new Line2D.Double(point[i-1].getX()*xInc + PAD, PAD + (maxY*2 - point[i-1].getY())*yInc, point[i].getX()*xInc + PAD, PAD + (maxY*2 - point[i].getY())*yInc)); 
        }
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // paintGrid(g);
        drawPoints(g);
    }
    
    public void paintComponent(float inXa, float inYa, float inXb, float inYb){
        this.inXa = inXa;
        this.inXb = inXb;
        this.inYa = inYa;
        this.inYb = inYb;
    }    
}
```

Values.Java

```
/**                                                                     *
  *      This File is for saving the values of the scenarios object     *
  *      temporary to the proccess. Do not modify anything              *
  *                                                                     **/
package try_02;

import try_02.DrawPanel;

public class Values {

    private static float maxValue = 0, minValue = 0;
    private static int valueNumber = 0;
    private float x = 0;
    private float y = 0;
    
    public Values() {

    }
    
    public void setX(float input) {
        x = input;
        valueNumber++;
    }
    
    public void setY(float input) {
        y = input;
    }
    
    public static int getValueNumber() {
        return valueNumber;
    }
    
    public static float getMaxValue() {
        return maxValue;
    }
    
    public static float getMinValue() {
        return minValue;
    }
    
    public float getX() {
        return x;
    }
    
    public float getY() {
        return y;
    }
    
}
```

Vielen Danke für die bisherige und hoffentlich folgende Hilfe


----------



## Gast2 (26. Sep 2007)

Also du solletst so wenig wie möglich in der paintComponent rechnen und das schon davor erledigen und der paint Methode nachher nur eine ArrayList deiner Linien die du zeichnen willst geben.

EDIT: und zweistens du malst nie Punkte(points) also wirst auch nie welche sehen


----------



## Guest (26. Sep 2007)

Danke für die schnelle antwort.

Male ich nicht genau hier?:

```
while( i < lenght ) {
            i++;
            g2.draw(new Line2D.Double(point[i-1].getX()*xInc + PAD, PAD + (maxY*2 - point[i-1].getY())*yInc, point[i].getX()*xInc + PAD, PAD + (maxY*2 - point[i].getY())*yInc));
        }
```

Und das mit dem rechnen kann ich wohl kaum umgehen da ich ja möchte das sich die Zeichnung immer verhältnismäßig dem Fenster anpasst (w und h). Sicherlich würden mir Threads helfen oder?


----------



## Gast2 (26. Sep 2007)

natürlich kannst du das rechnen umgehen... wenn panel größer oder kleiner wird ein Listener drauf legen

ja ich denke mal dass du zeichnest aber das kannst auch direkt in der paintComponent methode machen.
aber was deine schleife macht muss man nicht verstehen oder??
du hättest nur eine for schleife machen sollen die solange läuft wie dein array noch elemente hat und die elemente soll er dann zeichnen


----------



## Guest (26. Sep 2007)

Wie denn das? Mein Array hat mehr Elemente als Punkte da ich ja erst weis wie viele Punkte es sind wenn ich die Messwerte (deren Anzahl variiert) ausgelesen habe :?


----------



## Gast2 (26. Sep 2007)

1. malst du grad linien und keine punkte...
2. warum sollte dein array mehr punkte haben als du hast  :?:  :?:  :?: !!!!!
du sollst nur die punkte rein nehmen die du wirklich zeichnen willst dein array muss ja nicht konstant sein , es kann sich ja im laufe der zeit ändern....des macht deiner schleife aber nichts :!:  :!:  :!:


----------



## Guest (26. Sep 2007)

Weil ich wenn ich das Array erstelle, ihm eine Größe von 100 zuweise und alle Array-Felder von 0 bis 100 den Wert 0 erhalten oder sehe ich das Falsch? Und wenn ich nun alle Elemente des Arrays ausgeben lasse habe ich 100 Punkte, was wiederrum 50 Linien macht obwohl ich vlt nur 20 Werte also 10 Linien habe.

Ich lasse mich aber gerne belehren, denn wie gesagt bin ich noch totaler Neuling.

Vielen Dank für deine Geduld


----------



## Gast2 (26. Sep 2007)

```
ArrayList list =new ArrayList();
Linien2D linie

for(int i=0;i<list.size();i++)
{
linie=(Linien2D)list.get(i);
g.draw.......
}
```


und wenn du jetzt noch PUNKTE,RECHTECKE, usw. zeichnen willst kannst die auch in einen eigenes Arrayschreiben

ich weiß nicht ob es size() oder length() ist musste nachschauen.


----------

