# fließende/bewegende Striche eines Auswahlrechtecks



## SuperFamicom (21. Dez 2008)

Hallo,

gibt es bereits in Java derartige Methoden, die das <siehe Thread-Titel> realisieren?
Also eine normale dashed line bewegt sich nicht um das Auswahlrechteck. Ich hätte gerne, dass diese sich wie in einem Grafikprogramm (z.B. Photoshop) fließend im Kreis bewegt.

Ich danke schonmal im Voraus


----------



## Quaxli (22. Dez 2008)

Ich sag pauschal erst mal: nein. Selber basteln ist da angesagt. Allerdings hast Du nicht viele Details mit einfließen lassen. Worum geht's überschriebenes (J)Panel? Oder was anderes?


----------



## SuperFamicom (22. Dez 2008)

Hm, naja... also das ganze soll auf einem JPanel geschehen. Dort ist eine Grafik drauf gepappt, die per Maus in bestimmte rechteckige Bereiche zerlegt werden kann. Ich denke, ich würde die Linien von Canvas ableiten wollen. Mit einer MouseDragged-Implementierung würde man dann die 4 gestrichelten Striche oder das eine gestrichelte Rechteck variabel skalieren können.


----------



## Quaxli (23. Dez 2008)

Ich würde die Klasse von Rectangle ableiten  Mehr Informationen als x/y-Position und Länge/Breite der Auswahl brauchst Du ja nicht, oder?


----------



## Quaxli (23. Dez 2008)

Mal ein kleines Beispiel. Es ist nicht ganz was Du brauchst, da eine permanente Animation etwas aufwändiger ist. Nur um das Konzept darzustellen und Dich vor allem dazu zu bringen KEIN Canvas zu verwenden 


```
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class Display extends JPanel implements MouseMotionListener, MouseListener{
	
	Choice choice = null;
	
	public static void main(String[] args){
  	new Display();
  }
  
  public Display(){
  	JFrame frame = new JFrame("Auswahl");
  	frame.setSize(400,400);
  	frame.setLocation(100,100);
  	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  	frame.add(this);
  	addMouseListener(this);
  	addMouseMotionListener(this);
  	frame.setVisible(true);
  }

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		//Hier käme ein Bild
		g.setColor(Color.GREEN);
		g.fillRect(120, 120, 50, 70);

		if(choice!=null){
		  choice.draw(g);
		}
	}

	public void mouseDragged(MouseEvent e) {
		choice.width = e.getPoint().x - choice.x;
		choice.height = e.getPoint().y - choice.y;
		repaint();
	}

	public void mouseMoved(MouseEvent e) {
		
	}

	public void mouseClicked(MouseEvent e) {

	}

	public void mouseEntered(MouseEvent e) {
		
	}

	public void mouseExited(MouseEvent e) {
		
	}

	public void mousePressed(MouseEvent e) {
		System.out.println("hier");
		choice = new Choice();
		choice.x = e.getPoint().x;
		choice.y = e.getPoint().y;		
	}

	public void mouseReleased(MouseEvent e) {
		
	}

}

class Choice extends Rectangle{
	
	boolean flickr;
	
	public Choice(){
		super();
	}
	
	public void draw(Graphics g){
		if(flickr){
			g.setColor(Color.RED);
		}else{
			g.setColor(Color.BLUE);
		}
		g.drawRect(x, y, width, height);
		flickr = !flickr;
	}
	
}
```


----------



## SuperFamicom (23. Dez 2008)

Gut, ich versuche mich da mal dran. Die Animation über die draw-Methode, die über repaint() aufgerufen wird, laufen zu lassen, ist sinnvoll und hilft mir weiter (ich hätte beinah Runnable implementiet und eine eigene run-Methode überschrieben). Muss ich nur versuchen, die Geschwindigkeit für die Striche zu drosseln...

Danke für die Hilfe :applaus:


----------



## Marco13 (23. Dez 2008)

Ähm - ich dachte um genau so eine Animation geht es? (DAfür bräuchte man wohl einen eigenen Thread

```
// Von [url]http://www.java-forum.org/de/viewtopic.php?t=80115&highlight=[/url]

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class Display extends JPanel implements MouseMotionListener, MouseListener{

   Choice choice = null;

   public static void main(String[] args){
     new Display();
  }

  public Display(){
     JFrame frame = new JFrame("Auswahl");
     frame.setSize(400,400);
     frame.setLocation(100,100);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.add(this);
     addMouseListener(this);
     addMouseMotionListener(this);
     frame.setVisible(true);
  }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      //Hier käme ein Bild
      g.setColor(Color.GREEN);
      g.fillRect(120, 120, 50, 70);

      if(choice!=null){
        choice.draw(g);
      }
   }

   public void mouseDragged(MouseEvent e) {
      choice.width = e.getPoint().x - choice.x;
      choice.height = e.getPoint().y - choice.y;
      repaint();
   }

   public void mouseMoved(MouseEvent e) {

   }

   public void mouseClicked(MouseEvent e) {

   }

   public void mouseEntered(MouseEvent e) {

   }

   public void mouseExited(MouseEvent e) {

   }

   public void mousePressed(MouseEvent e) {
      System.out.println("hier");
      if (choice != null)
      {
          choice.stop();
      }
      choice = new Choice(this);
      choice.x = e.getPoint().x;
      choice.y = e.getPoint().y;
   }

   public void mouseReleased(MouseEvent e) {

   }

}

class Choice extends Rectangle implements Runnable
{

   private boolean stopped = false;
   private Component owner = null;
   private float phase = 0.0f;

   public Choice(Component owner)
   {
      this.owner = owner;
      new Thread(this).start();
   }

    public void run()
    {
        while (!stopped)
        {
            phase += 1f;
            owner.repaint();
            try
            {
                Thread.sleep(10);
            }
            catch (InterruptedException e)
            {
            }
        }
    }

    public void stop()
    {
        stopped = true;
    }

   public void draw(Graphics gr)
   {
        Graphics2D g = (Graphics2D)gr;
        g.setColor(Color.BLACK);
        BasicStroke dashed = new BasicStroke(1.0f,
                                             BasicStroke.CAP_BUTT,
                                             BasicStroke.JOIN_MITER,
                                             10.0f, new float[]{10}, phase);
        g.setStroke(dashed);
        g.drawRect(x, y, width, height);
   }

}
```


----------



## Quaxli (23. Dez 2008)

SuperFamicom hat gesagt.:
			
		

> Gut, ich versuche mich da mal dran. Die Animation über die draw-Methode, die über repaint() aufgerufen wird, laufen zu lassen, ist sinnvoll und hilft mir weiter (ich hätte beinah Runnable implementiet und eine eigene run-Methode überschrieben). Muss ich nur versuchen, die Geschwindigkeit für die Striche zu drosseln...
> 
> Danke für die Hilfe :applaus:



Wie Marco gezeigt hat, warst Du schon auf dem richtigen Weg. Wenn Du mein Beispiel ausprobiert hast, hast Du auch gesehen, daß die "Animation" nur so lange läuft, wie ausgewählt wird. Wie ich geschrieben hatte, war meine Lösung nicht das Ideale, sonder sollte Dich nur davon abhalten Canvas zu verwenden 
Wenn Du die Erweiterung von Marco nimmst, bist Du gut dabei.

@Marco13:
Danke!


----------



## Marco13 (23. Dez 2008)

Wobei man da dann noch erwähnen sollte, dass das nur in dein Beispiel rein-gehackt war.... Über die vernünftigste Struktur (wo wird der Thread erstellt und gestartet/gestoppt, wie löst man das repaint aus usw) sollte man sich da nochmal Gedanken machen...


----------



## SuperFamicom (24. Dez 2008)

Sehr gut. Danke!


----------

