Grafikobjekte mit Mouse auswählen und verschieben

Status
Nicht offen für weitere Antworten.

Maver2000

Mitglied
Hi,

ich bastle an einem Grafikeditor. Und es klappt prima verschiedene Formen, z.B. Polygone und Kreise zu zeichen. Ich möchte diese aber nun im nachhinein per Mouse auswählen und verschieben. Kann mir einer sagen, wie ich das mache. Ich schaffe es nämlich irgendwie nicht den einzelnen Objekten MouseListener zuzuweisen, oder ist das der falsche Ansatz.

Recht herzlichen Dank.
 

L-ectron-X

Gesperrter Benutzer
Ich habe mal vor einiger Zeit etwas ähnliches in einem funktionstüchtigen Applet programmiert. Es ist aber nie fertig gestellt worden und hat daher seine Macken, macht aber in etwa das, was Du suchst. Im Prinzip dürften für Dich die MouseListener-Methoden interessant sein.
Java:
//Benötigte Pakete importieren.
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Rechtecke extends Applet {

  private int b, h; //Breite und Höhe des Applets
  private int x, y; //Aktuelle Maus-Koordinaten
  private int x1, y1; //Maus-Koordinaten bei MouseEvents
  private Rectangle r; //Variable vom Typ Rectangle (Rechteck)
  private Vector rechtecke; //Behälter für Rechtecke
  private boolean verschieben = false;

  //die init()-Methode aus Applet
  public void init() {
    rechtecke = new Vector(); //Behälter für die Rechtecke erstellen
    b = getWidth(); //Breite aus dem Applet-Tag
    h = getHeight(); //Höhe aus dem Applet-Tag

    /*Einen MouseListener am Applet anmelden. Hier in einer Variante
    * mit einem MouseAdapter, so brauchen nicht alle Methoden
    * des MouseListeners überschrieben werden.
    */
    addMouseListener(new MouseAdapter() {
      //Wenn die Maustaste gedrückt gehalten wird.
      public void mousePressed(MouseEvent e) {
        //Erfassen der momentanen Maus-Position.
        x = e.getX();
        y = e.getY();
          
        //Wenn bereits Rechtecke im Behälter sind.
        if(!rechtecke.isEmpty()) {
          //Jedes einzelne der Rechtecke holen.
          for(int i = 0; i < rechtecke.size(); i++) {
            r = (Rectangle)rechtecke.elementAt(i);
            //Feststellen ob und auf welche(s) Rechteck(e) geklickt wurde.
            if(r.getX() < x && r.getY() < y && r.getWidth() > x && r.getHeight() > y) {
              /*Das erste gefundene Rechteck ans Ende des Vectors verschieben,
              * damit es beim Zeichnen immer oben liegt.
              * Dann Rechteck als zu verschieben markieren und Methode verlassen.
              */
              rechtecke.add(rechtecke.remove(i));
              verschieben = true;
              return;
            }
          }
        }
      }

      //Wenn die Maustaste wieder losgelassen wird.
      public void mouseReleased(MouseEvent e) {
        //Ungültiger Mausklick
        if(x1 == y1)
          return;
          
        //Wenn auf kein Rechteck geklickt wurde.
        if(!verschieben) {
        //Neues Rechteck erzeugen
          r = new Rectangle(x, y, x1, y1);
          //Das Rechteck dem Behälter hinzfügen.
          rechtecke.add(r);
          repaint();
        }
        //Wenn Maustaste losgelassen wird ist verschieben beendet.
        verschieben = false;
      }
    });

    /*Einen MouseMotionListener am Applet anmelden. Hier in einer Variante
    * mit einem MouseMotionAdapter. MouseMotionListener implementiert zwar
    * nur die zwei folgenden Methoden, so ist es aber auch übersichtlicher.
    */
    addMouseMotionListener(new MouseMotionAdapter() {
      //Wenn die Maus mit gedrückter Maustaste bewegt wird.
      public void mouseDragged(MouseEvent e) {
        setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
        showStatus("Rechteck zeichnen");
        //Koordinaten-Information bei Rechteck zeichnen und Verschieben.
        x1 = e.getX();
        y1 = e.getY();
        if(verschieben)
          verschieben(r);
        //Komplettes Bild neu zeichen incl. Hintergrund
        repaint();
      }
      
      //Wenn die Maus bewegt wird.
      public void mouseMoved(MouseEvent e) {
        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        //Status des Applets in Browser-Statuszeile anzeigen.
        showStatus("Bereit für Benutzeraktion");
        x = e.getX();
        y = e.getY();
        x1 = 0;
        y1 = 0;
        repaint();
      }
    });
  }
  
  //Verschiebt das angeklickte Rechteck.
  private void verschieben(Rectangle r) {
    setCursor(new Cursor(Cursor.MOVE_CURSOR));
    //Status des Applets in Browser-Statuszeile anzeigen.
    showStatus("Rechteck verschieben");
    int breite = (int)(r.getWidth() - r.getX());
    int hoehe = (int)(r.getHeight() - r.getY());
    //Diemension des Rechtecks herstellen
    int x2 = x1 + breite;
    int y2 = y1 + hoehe;
    r.setBounds(x1, y1, x2, y2);
  }

  public void paint(Graphics g) {
    //Den Bereich für die Koordinaten-Ausgabe löschen
    g.clearRect(0, 0, b, h);
    
    //Koordinaten zeichnen
    g.setColor(Color.BLACK);
    g.drawString("x = "+x, 5, 15);
    g.drawString("y = "+y, 55, 15);
    g.drawString("x1 = "+x1, 110, 15);
    g.drawString("y1 = "+y1, 165, 15);
    
    /*Jedes Rechteck aus dem Behälter holen,
    * dessen Werte ermitteln und zeichnen
    */
    for(int i = 0; i < rechtecke.size(); i++) {
      int x = (int)((Rectangle)rechtecke.elementAt(i)).getX();
      int y = (int)((Rectangle)rechtecke.elementAt(i)).getY();
      int breite = (int)((Rectangle)rechtecke.elementAt(i)).getWidth()-x;
      int hoehe = (int)((Rectangle)rechtecke.elementAt(i)).getHeight()-y;
      //Schatten zeichnen.
      g.setColor(Color.GRAY);
      g.drawRect(x+1, y+1, breite, hoehe);
      //Rahmen für das Rechteck zeichnen.
      g.setColor(Color.BLACK);
      g.drawRect(x, y, breite, hoehe);
      //Rechteck füllen.
      g.setColor(Color.WHITE);
      g.fillRect(x+1, y+1, breite-1, hoehe-1);
    }
  }
  
  public void update(Graphics g) {
    g.setColor(getBackground());
    g.fillRect(0, 0, b, h);
    g.setColor(getForeground());
    paint(g);
  }
}
 
Zuletzt bearbeitet:

Maver2000

Mitglied
Recht herzlichen Dank, dass Applet ist schon zum großen Teil das, wo ich hin will.

Code:
			if(r.getX() < x && r.getY() < y && r.getWidth() > x && r.getHeight() > y) {

Diese Auswertung ist für Rechtecke ja auch noch gut zu realisieren, aber wie handhabe ich das bei nichtgeschlossenen Polygonzügen.

Mir hat mal jemand was davon erzählt, jedes einzelne Grafikobjekt als Container zu initialisieren. Aber das kann ich mir nicht vorstellen, wie das gehen soll, da ich meine Polygone in einer ähnlichen Vektorstruktur habe, wie das bei dir realisiert wurde. Und kann ich den einzelnen Objekten dann MouseListener bzw. MouseMotionListener zuweisen?

Aber zunächst Danke für Deine Hilfe, es hat mich schon ein ganzes Stück weiter gebracht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D 2D-Grafik Form der GrafikObjekte ändern, Ellipse -> Rectangle AWT, Swing, JavaFX & SWT 2
L Grafikobjekte per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 3
G mouse events AWT, Swing, JavaFX & SWT 6
N Mouse methods AWT, Swing, JavaFX & SWT 10
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
M Java FX Mouse over AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
B GUI mit Mouse Touch AWT, Swing, JavaFX & SWT 27
S Mouse Events in einer sortierten JTable unterscheiden AWT, Swing, JavaFX & SWT 18
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
H Rechteck via Mouse bewegen AWT, Swing, JavaFX & SWT 2
H Java Robot mouse funktioniert nur auf Notebook nicht. AWT, Swing, JavaFX & SWT 4
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Mouse Track Lisetner AWT, Swing, JavaFX & SWT 2
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
M Mouse Wheel Listener reagiert mehrmals AWT, Swing, JavaFX & SWT 5
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
H fwststellen, ob sich Mouse auf dem Rand befindet AWT, Swing, JavaFX & SWT 3
Dit_ Buttons Mouse-Over Effekt AWT, Swing, JavaFX & SWT 8
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
raptorrs JFrame nur anzeigen, solange die Mouse gedrückt ist AWT, Swing, JavaFX & SWT 3
G JButton Mouse Over Text AWT, Swing, JavaFX & SWT 2
T Mouse Popup AWT, Swing, JavaFX & SWT 2
M Bug; Swing-Worker, Progressbar und Mouse AWT, Swing, JavaFX & SWT 22
R Mouse Wheel funktioniert nicht im JDialog ! AWT, Swing, JavaFX & SWT 4
T mouse-event auf jcolorchooser AWT, Swing, JavaFX & SWT 2
M eine zeichnen beim mouse ziehen AWT, Swing, JavaFX & SWT 8
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
S Rechteck per Mouse aufziehen AWT, Swing, JavaFX & SWT 7
S Mouse-Event in JTable AWT, Swing, JavaFX & SWT 3
K Mouse Position nach Drag und Drop? AWT, Swing, JavaFX & SWT 4
D JLabel aus einem Mouse- bzw. KeyListener aendern AWT, Swing, JavaFX & SWT 2
G Linie mit der Maus auswählen AWT, Swing, JavaFX & SWT 5
M JavaFX Tab auswählen mit JavaFX AWT, Swing, JavaFX & SWT 9
B JavaFX JavaFX Table gespeichertes Wert auswählen/anvisieren AWT, Swing, JavaFX & SWT 3
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
domjos1994 JavaFX Element auswählen auf dem der Cursor ist AWT, Swing, JavaFX & SWT 1
S Pfad für Speichervorgang auswählen AWT, Swing, JavaFX & SWT 11
E JavaFX TableView mit Rechtsklick Zelle auswählen AWT, Swing, JavaFX & SWT 8
W Bei Programmstart jRadioButton automatisch auswählen AWT, Swing, JavaFX & SWT 2
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
H Swing Element aus JComboBox auswählen AWT, Swing, JavaFX & SWT 2
S Swing Ordner im JFileChooser auswählen AWT, Swing, JavaFX & SWT 2
N Speicherpfad für Datei auswählen AWT, Swing, JavaFX & SWT 2
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
P Swing RadioButtons - nur einen auswählen AWT, Swing, JavaFX & SWT 3
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6
Dit_ JTextField | Text auswählen und Caret setzen AWT, Swing, JavaFX & SWT 7
H Swing jTable Zeitspanne auswählen AWT, Swing, JavaFX & SWT 3
Landei Swing JTree - Element mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 4
M FileChooser Bilder auswählen AWT, Swing, JavaFX & SWT 8
M Swing jcombobox als jtable-editor: neues Item auswählen AWT, Swing, JavaFX & SWT 4
R JFileChooser - Initiales Verzeichnis auswählen AWT, Swing, JavaFX & SWT 8
N Mit JFileChooser ein Verzeichnis auswählen AWT, Swing, JavaFX & SWT 7
S [gelöst] API zum bequemen Navigieren und Auswählen von Ordnern AWT, Swing, JavaFX & SWT 3
N Defaulttext per Mausklick auswählen AWT, Swing, JavaFX & SWT 4
R Zahl aus Zahlenbereich auswählen AWT, Swing, JavaFX & SWT 9
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
D JTree programmtechnisch mehrere Nodes auswählen. AWT, Swing, JavaFX & SWT 2
N JCalendar - Kein Datum auswählen AWT, Swing, JavaFX & SWT 3
S JTable Reihe auswählen AWT, Swing, JavaFX & SWT 2
S Welches Event beim auswählen einer Zelle? [JTable] AWT, Swing, JavaFX & SWT 3
A JTable zeile auswählen AWT, Swing, JavaFX & SWT 2
K Zeilen von TextArea auswählen AWT, Swing, JavaFX & SWT 3
B JComboBox Item auswählen AWT, Swing, JavaFX & SWT 11
A jtextarea -> ganze zeile auswählen AWT, Swing, JavaFX & SWT 5
H Noch einmal JList (nichts auswählen) AWT, Swing, JavaFX & SWT 2
K Bilddatei mit Filechooser auswählen und anzeigen/impotieren AWT, Swing, JavaFX & SWT 18
P JSpinner Objekt anstatt Zahlen sollen man Namen auswählen AWT, Swing, JavaFX & SWT 2
J JList-Item ind JTable-Zelle auswählen. AWT, Swing, JavaFX & SWT 5
F JTree Letzte Node auswählen AWT, Swing, JavaFX & SWT 8
D "Datei auswählen" Fenster AWT, Swing, JavaFX & SWT 5
G [AWT] Zeichnungen per Maus auswählen AWT, Swing, JavaFX & SWT 8
R JTable: nur eine Zeile auswählen AWT, Swing, JavaFX & SWT 2
T Zeile in JTable mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 8
F Tree-Knoten programmgesteuert auswählen AWT, Swing, JavaFX & SWT 3
K Farbverlauf -> Farbe auswählen mit Regler || JTable Selec AWT, Swing, JavaFX & SWT 5
G für showInputDialog kein eigenes Icon auswählen AWT, Swing, JavaFX & SWT 6
bernd Aus einem JTextArea einen Eintrag auswählen AWT, Swing, JavaFX & SWT 11
P Inhalt von JTextField beim Auswählen markieren AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben