fließende/bewegende Striche eines Auswahlrechtecks

Status
Nicht offen für weitere Antworten.
S

SuperFamicom

Gast
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 :D
 

Quaxli

Top Contributor
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?
 
S

SuperFamicom

Gast
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

Top Contributor
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

Top Contributor
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 ;)

Code:
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;
	}
	
}
 
S

SuperFamicom

Gast
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

Top Contributor
Ähm - ich dachte um genau so eine Animation geht es? (DAfür bräuchte man wohl einen eigenen Thread
Code:
// 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

Top Contributor
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

Top Contributor
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...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Sich bewegende Kamera Spiele- und Multimedia-Programmierung 12

Ähnliche Java Themen

Neue Themen


Oben