# Linien in ein Koordinatensystem zeichen



## Guest (25. Mrz 2004)

Weiss jemand wo ich gut verständliche Programmbeispiele für folgendes Problem herbekomme:

Ich möchte das der User mit der Maus Linien in ein grafisch dargestelltes Koordinatensystem zeichnen kann!

mit freundlichen Grüssen,
Anne


----------



## Illuvatar (25. Mrz 2004)

Hm. Wie meinst du das?

Du köntest z.B. einen MouseMotionListener machen, einen MouseListener, die Koordinaten der Start und Endpunkte als Point2D-Objekte in einem Vektor speichern und in der paint-Methode zeichnen (Edit: und auch das Koordinatensystem).

Ähnilich wie Bsp. 29.4 im Javabuch:


```
/* Listing2904.java */

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Listing2904
extends Frame
{
  private Vector drawlist;
  private Rectangle actrect;

  public static void main(String[] args)
  {
    Listing2904 wnd = new Listing2904();
    wnd.setLocation(200,200);
    wnd.setSize(400,300);
    wnd.setVisible(true);
  }

  public Listing2904()
  {
    super("Rechtecke zeichnen");
    drawlist = new Vector();
    actrect = new Rectangle(0,0,0,0);
    addWindowListener(new MyWindowListener());
    addMouseListener(new MyMouseListener());
    addMouseMotionListener(new MyMouseMotionListener());
  }

  public void paint(Graphics g)
  {
    Rectangle r;
    Enumeration e;

    for (e = drawlist.elements(); e.hasMoreElements(); ) {
      r = (Rectangle)e.nextElement();
      g.drawRect(r.x, r.y, r.width, r.height);
    }
    if (actrect.x > 0 || actrect.y > 0) {
      g.drawRect(
        actrect.x,
        actrect.y,
        actrect.width,
        actrect.height
      );
    }
  }

  class MyMouseListener
  extends MouseAdapter
  {
    public void mousePressed(MouseEvent event)
    {
      actrect = new Rectangle(event.getX(),event.getY(),0,0);
    }

    public void mouseReleased(MouseEvent event)
    {
      if (actrect.width > 0 || actrect.height > 0) {
        drawlist.addElement(actrect);
      }
      repaint();
    }
  }

  class MyMouseMotionListener
  extends MouseMotionAdapter
  {
    public void mouseDragged(MouseEvent event)
    {
      int x = event.getX();
      int y = event.getY();
      if (x > actrect.x && y > actrect.y) {
        actrect.width = x - actrect.x;
        actrect.height = y - actrect.y;
      }
      repaint();
    }
  }

  class MyWindowListener
  extends WindowAdapter
  {
    public void windowClosing(WindowEvent event)
    {
      setVisible(false);
      dispose();
      System.exit(0);
    }
  }
}
```


----------



## Guest (25. Mrz 2004)

Ja sowas in der Art, nur wo man Linien in ein Koordinatensystem(grafisch dargestellt) anlegen kann!


----------



## Guest (5. Apr 2004)

hat keiner sonst noch ein Beispiel oder ne Idee wie ich das machen könnte?


----------



## Illuvatar (5. Apr 2004)

Ich weiß nicht genau, wie du das meinst.

Du könntest ja in der paint Methode einfach noch vorher das Koordinatensystem zeichnen, oder?


----------



## Guest (5. Apr 2004)

Joa so was in der Art! Nur das Problem wie zeichne ich das da rein? Und 2. wie gebe ich das dann so an das er genau auf den Koordinatenpunkten nur was zeichnen darf?


----------



## Illuvatar (5. Apr 2004)

Jetzt beginne ich zu verstehen, was du meinst.

Du könntest ja in einem GridLayout viele Einzelkomponenten machen, die alle ein Kreuz zeichnen.
Damit man erkennt auf welchem man ist, könnte man mit einem MouseListener (mouseEntered) das aktuelle Kreuz rot zeichnen.
Und wenn man auf eines dieser Komponenten klickt,  wird der Startpunkt gemerkt, wenn irgendwo mouseReleased aufgerufen wird, das als Endpunkt, und die Koordinaten der Mittelpunkte der beiden Komponenten werden in einem Vector gespeichert.
Die so gespeicherten Rechtecke dann in der paint-Methode speichern.


----------



## Beni (5. Apr 2004)

@Illuvatar
Systemressourcen, *schlürf* und weg waren sie...  :bae: 

Genug über andere Leute lustiggemacht, jetzt muss ich auch zeigen, dass es anders geht:

Ich hab mal was zusammengehackt. Das ist sicher noch kein Zeichnungsprogramm, aber mal ein Anfang :wink:
Einfach in eine Datei "Main.java" kopieren, und ausführen.
	
	
	
	





```
package forum;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.event.MouseInputAdapter;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.getContentPane().add( new DrawPanel() );
        frame.setBounds( 20, 20, 500, 500 );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setVisible( true );
    }
}

class DrawPanel extends JComponent{
    public static final float MOD_X = 30.0f;
    public static final float MOD_Y = 30.0f;
    
    private Vector lines = new Vector();
    
    public DrawPanel(){
        Listener listener = new Listener();
        addMouseListener( listener );
        addMouseMotionListener( listener );
    }
    
    public synchronized void paintComponent( Graphics g ){
        int width = getWidth();
        int height = getHeight();
        
        g.setColor( Color.BLACK );
        g.fillRect( 0, 0, width, height );
        
        g.setColor( Color.GRAY );
        
        for( int x = 0; x <= width; x += (int)(MOD_X) )
            g.drawLine( x, 0, x, height );
        
        for( int y = 0; y <= height; y += (int)(MOD_Y) )
            g.drawLine( 0, y, width, y );
        
        for( int i = 0, n = lines.size(); i<n; i++ ){
            ((Line)lines.get( i )).paint( g, MOD_X, MOD_Y );
        }
    }
    
    private class Listener extends MouseInputAdapter{
        private Line current;
        
        public Listener(){}
        public void mousePressed(MouseEvent e) {
            Point pos = transform( e.getX(), e.getY() );
            current = new Line( pos.x, pos.y );
            lines.add( current );
            repaint();
        }
        
        public void mouseDragged(MouseEvent e) {
            if( current != null ){
                current.setEndPos( transform( e.getX(), e.getY() ) );
                repaint();
            }
        }
        
        
        public void mouseReleased(MouseEvent e) {
            mouseDragged( e );
            current = null;
        }
        
        public Point transform( int x, int y ){
            return new Point( Math.round(x / MOD_X), Math.round( y / MOD_Y ) );
        }
    }
}

class Line{
    private int x1, y1, x2, y2;
    private Color color;
    
    public Line( int x, int y ){
        x1 = x;
        y1 = y;
        x2 = x;
        y2 = y;
        color = new Color( (int)(Math.round( Math.random() * 255)),
                (int)(Math.round( Math.random() * 255)),
                (int)(Math.round( Math.random() * 255)));
    }
    
    public void setEndPos( Point pos ){
        x2 = pos.x;
        y2 = pos.y;
    }
    
    public void paint( Graphics g, float modX, float modY ){
        g.setColor( color );
        g.drawLine( Math.round( modX * x1 ),
                Math.round( modY * y1 ),
                Math.round( modX * x2 ),
                Math.round( modY * y2 ));
    }
}
```

mfg Beni


----------

