# Koordinaten von Punkten übergeben und zeichnen lassen



## Cespenar (26. Aug 2004)

also das dürfte für euch sicher kein Problem darstellen

ich habe: 
- ein von JPanel abgeleitetetes graphicpanel in das ich mittels paintComponent dinge einzeichnen kann
- eine weitere public class in der ein paar jButtons Textfield etc. enthalten und weiterhin eine Berechnung von Werten  
stattfindet

durch drücken eines Buttons läuft die Berechnung ab und schreibt die Ergebnisse in ein 2D-Array
Mein Problem:
wie kann ich die Berechneten Werte (Punkte (x,y) ) an paintComponent übergeben (entweder einzeln oder gleich das gesamte Feld)
bzw. wie kann ich überhaupt paintComponent nochmals aufrufen
paintComponent wird ja nur gleich zu beginn aufgerufen und da sind die Werte noch nicht bekannt
------
ich hab´s bisher mit einem Transfer Objekt versucht auf das beide Klassen zugreifen können
die eine Klasse schreibt die Werte rein, die andere liest sie wieder aus
das ginge aber natürlich nur wenn ich die Klasse aufrufen könnte
--------
gibts da keinen einfachen weg der vergleichbar ist mit dem aufrufen von anderen Methoden bei dem ich einfach die Werte übergeben kann ?

schon mal thx


----------



## Beni (26. Aug 2004)

Du speicherst den Array zuerst mal in dem neuen Panel, und dann rufst du "repaint" auf, was schlussendlich zu einem Neuzeichnen des Panels führt:


```
public class PaintPanel extends JPanel{
  private int[] xPoints, yPoint;

  public void setPoint( int[] x, int[] y ){
    xPoints = x;
    yPoints = y;

    repaint();
  }

  public void paintComponent( Graphics g ){
    if( xPoints != null ) 
      [...]
  }
}
```


----------



## Cespenar (26. Aug 2004)

danke das hat mir weiter geholfen aber es geht leider noch nicht


```
package SimpleGraphics;

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

public class SimpleGraphicsPanel extends JPanel
{
    private int[] PosX,PosY; 
     
     public SimpleGraphicsPanel()
     {
     this.setBackground(Color.white);
     this.setPreferredSize(new Dimension(500,500));
     }

   public void paintComponent(Graphics g)
   {
      int Anzahl=0;
      super.paintComponent(g);
      g.setColor(Color.red);
      if( PosX != null ) 
      {
        for (Anzahl=0;Anzahl<100;Anzahl++)
        {
        g.drawLine(PosX[Anzahl],PosY[Anzahl],PosX[Anzahl],PosY[Anzahl]);
        }
      }
     
    }
   
  public void setPoint( int[] x,int[] y ){
      PosX = x;
      PosY = y;
      repaint();
  } 

}
```

die setPoint Methode bekommt die Werte aber irgendwie geht das mit dem repaint nicht
vielleicht erkennt ja jemand den Fehler im code


----------



## Beni (26. Aug 2004)

Ich weiss nicht, eine Linie die eine Länge von 0 hat...

```
g.drawLine(PosX[Anzahl],PosY[Anzahl],PosX[Anzahl],PosY[Anzahl]);
```


Wie ist es, wenn du kleine Rechtecke zeichnest:

```
g.fillRect(PosX[Anzahl],PosY[Anzahl], 10, 10 );
```


----------



## Cespenar (26. Aug 2004)

leider liegt es nicht daran
das mit der länge 0 ist nur ein notbehelf da ich keinen Befehl gefunden hab um punkte zu Zeichnen


----------



## Beni (26. Aug 2004)

Hab ich auch nie gefunden, gibt es wohl auch nicht.

Lass mal ein bisschen mehr Code sehen (gerade genug, damit man das Progi laufen lassen kann).


----------



## Cespenar (26. Aug 2004)

Ok ich versuchs mal


```
import SimpleGraphics.*;
import javax.swing.*;



public class SimpleGraphicsTest
{

  public SimpleGraphicsTest()
  {
    SimpleGraphicsFrame SGF = new SimpleGraphicsFrame();
    SGF.showIt();
  }
  public static void main(String[] args)
  { 
    SimpleGraphicsTest sgt = new SimpleGraphicsTest();
  }
}
```

und das hier noch

```
package SimpleGraphics;

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

public class SimpleGraphicsFrame extends SimpleFrame
{

    
     SimpleGraphicsPanel sgp = new SimpleGraphicsPanel();
     JScrollPane scrolli = new JScrollPane();
     // Panels
     JPanel Hauptdialog = new JPanel();
     JPanel obererHauptdialog = new JPanel();
     JPanel untererHauptdialog = new JPanel();
     // Wichtige Texteingabe Felder
     JTextField B = new JTextField("192");
     JTextField F = new JTextField("24");
     JTextField W = new JTextField("600");
     JTextField S = new JTextField("0.7");
     JLabel StatusInfo = new JLabel("ready",JLabel.CENTER);
     JLabel n = new JLabel("",JLabel.CENTER);
         // JButtons 
     JButton startButton = new JButton("start");
     JScrollPane SgscrP = new JScrollPane(sgp); //Scrollbar anfügen
     
  public SimpleGraphicsFrame()
  {
     // Action Listener initialisieren
     WachHund harras = new WachHund(this);
     
    //unwichtige nicht public Klassen wie Labels etc.  
     JLabel Label1 = new JLabel("B mm");
     JLabel Label2 = new JLabel("F mm");
     JLabel Label3 = new JLabel("W nm");
     JLabel Label4 = new JLabel("S");
     JLabel Label5 = new JLabel("n");
     
    //
     
    Hauptdialog.setLayout(new GridLayout(2,1));
    Hauptdialog.add(obererHauptdialog);
    Hauptdialog.add(untererHauptdialog);
    obererHauptdialog.setLayout(new GridLayout(5,2));
    untererHauptdialog.setLayout(new GridLayout(4,4));
    // Elemente für oberen Hauptdialog
    obererHauptdialog.add(Label1);
    obererHauptdialog.add(B);
    obererHauptdialog.add(Label2);
    obererHauptdialog.add(F);
    obererHauptdialog.add(Label3);
    obererHauptdialog.add(W);
    obererHauptdialog.add(Label4);
    obererHauptdialog.add(S);
    obererHauptdialog.add(Label5);
    obererHauptdialog.add(n);
    // Elemente für unteren Hauptdialog
    untererHauptdialog.add(startButton);
    untererHauptdialog.add(StatusInfo);
    this.setResizable(true);
    this.setTitle("Einfache Graphik");
    this.getContentPane().add(SgscrP,"Center");
    this.getContentPane().add(Hauptdialog,"East");
    // Elemente zu Action Listener hinzufügen
   
   startButton.addActionListener(harras);
    
    pack();
  }
  

    class WachHund implements ActionListener{
    private JFrame parent;

    public WachHund(JFrame p)
    {
      parent = p;
    }

    public void actionPerformed(ActionEvent evt)
     {
      String command = evt.getActionCommand();
      // command enthält jetzt die Beschriftung des gewählten Menüeintrags
      if(command.equals("start"))
      {
          StatusInfo.setText("Berechnung läuft");
          einfacheBerechnung();
      }

    }// method actionPerformed
   }//class WachHund

    public void einfacheBerechnung()
    {
    double f=Double.parseDouble(B.getText())*1E-3; 
    double d=Double.parseDouble(F.getText())*1E-3;; 
    double lambda=Double.parseDouble(W.getText())*1E-9;; 
    double PunktPosX=0; 
    double PunktPosY=0;
    double PunktPosZ=f;
   
    VorschauBerechnung(PunktPosX,PunktPosY,PunktPosZ,f,d,lambda);
     }
    public void VorschauBerechnung(double PunktPosX,double PunktPosY,double PunktPosZ,double f,double d,double lambda)
    {
    SimpleGraphicsPanel sgp = new SimpleGraphicsPanel(); //um auf die andere Klasse zugreifen zu können
    int[] Test1 = {1,2,3};
    int[] Test2 = {4,5,6};
 

        //Berrechnung abgeschlossen
        StatusInfo.setText("Berechnung abgeschlossen");
        //Berechentes Feld and Feldübergabe Funktion übergeben
        sgp.setPoint(Test1,Test2);
    }
}
```

ich hab natürlich die eigetliche Berechnung der Werte weggelassen, spielt ja hier auch keine Rolle
prinzipiell will ich hier die zwei Felder Test1 und Test2 (Test1 enthält x-Koordinaten und Test2 y-Koordinaten) übergeben und die Punkte zeichnen lassen


----------



## Beni (26. Aug 2004)

```
public void VorschauBerechnung(double PunktPosX,double PunktPosY,double PunktPosZ,double f,double d,double lambda)
    {

    //******************************************************************************************
    // Hier ist das Problem: du stellt ein neues SGP her, welches keinen Bezug zu dem anderen SGP hat...
    // Streich diese Zeile einfach mal raus (zumindest bei dem korpierten Code wurde dann das richtige SGP verwendet.
    SimpleGraphicsPanel sgp = new SimpleGraphicsPanel(); //um auf die andere Klasse zugreifen zu können
    //******************************************************************************************

    int[] Test1 = {1,2,3};
    int[] Test2 = {4,5,6};
 

        //Berrechnung abgeschlossen
        StatusInfo.setText("Berechnung abgeschlossen");
        //Berechentes Feld and Feldübergabe Funktion übergeben
        sgp.setPoint(Test1,Test2);
    }
}
```

Ach ja, es wird eine ArrayIndexOutOfBoundsException geben, aber das kriegst du schon hin :wink:


----------



## Cespenar (26. Aug 2004)

danke !
genau das wars  8) 
da hätte ich lange suchen können


----------

