Absolute Cursor Position oder doch relative?

Status
Nicht offen für weitere Antworten.

COBRA

Mitglied
Hallo @all

Was ich machen will ist ein kleiner Visual Editor für meine Java2D Komponenten.
Also vergrößern, verkleinern, verschieben und drehen.

Jetzt habe ich schon das erste Problem beim vergrößern und verkleinern.

Im MouseDrag wird die neue Größe und Position festgelegt.
Als Bespiel habe ich jetzt einfach ein Rechteck als Komponente genommen.
Wenn ich jetzt vergrößere nach rechts oben dann zuckt die Y Koordinate.
Wenn ich nach links unten vergrößere dann zuckt die X Koordinate.
In den beiden anderen Richtungen geht es Prima.

Sollte ich lieber die absolute Mouseposition bestimmen ? Wenn ja wie mache ich das.

Was mache ich falsch ? Kennt jemand ne Internetseite zu dem Thema da ich noch nicht so gut bin mit Graphik Bearbeitung.

Denke das ist der wichtigste Code:

Code:
    private void setMouseDragListener() {
        mouseDragListener = new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent e) {
                int q = 0; 
                if (isMarked && isMouseDown) {
                    
                    //Resize Upper Left Corner
                    newX = self.getX() + e.getX();
                    newY = self.getY() + e.getY();
                    System.out.println("e.getPoint():"+e.getPoint()); 
                   
                    self.setLocation(newX, newY);
	                if (oldX - newX+oldWidth > 0 ){
	                	if (oldY - newY + oldHeight>0){
	 	                   self.setSize(oldX - newX + oldWidth,(oldY - newY) + oldHeight);	                		
	                	}
	                	else{
	                        newX = self.getX() + e.getX();
	                        newY = self.getY() - e.getY();
	    	                self.setLocation(newX, newY);
		 	                self.setSize((oldX - newX) + oldWidth,e.getY());	                			    	                
	                	}
	                }
	                else{
		               	if (oldY - newY + oldHeight>0){
			                newX = self.getX() - e.getX();
			                newY = self.getY() + e.getY();
			    	        self.setLocation(newX, newY);
				 	        self.setSize(e.getX(),(oldY - newY) + oldHeight);
			            }
			            else{
			                newX = self.getX() - e.getX();
			                newY = self.getY() - e.getY();
			    	        self.setLocation(newX, newY);
				 	        self.setSize(e.getX(),e.getY());	                			    	                
			            }	
	                }
	                System.out.println((oldX-newX+oldWidth));
                }
            }
        };
    }



    private void setMouseDownListener() {
        mouseDownListener = new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent e) {
                //System.out.println("OnObject9 -> mouseDown()");
                if (!isMovable) {
                    return;
                }
                if (!isSizable) {
                    return;
                }

                setIsMouseDown(true);
                System.out.println("MouseDown X " + e.getX());
                System.out.println("MouseDown Y " + e.getY());
                oldX = self.getX();//+e.getX();
                oldY = self.getY();//+e.getY();
                oldWidth = self.getWidth();
                oldHeight = self.getHeight();
                if (isMarked) {
                    System.out.println("x == " + e.getX() + " - y == " + e.getY());
                    //Upper Left Region Box
                    if ((e.getX() >= 1)
                    		&& (e.getX() <= markerSize)
                    		&& (e.getY() >= 1)
                    		&& (e.getY() <= markerSize)) {
                        System.out.println("clicked upperleft regionbox");
                    }
                    //Upper Right Region Box
                    if ((e.getX() >= getWidth() - markerSize)
                    		&& (e.getX() <= getWidth() - 1)
                    		&& (e.getY() >= 1)
                    		&& (e.getY() <= markerSize)) {
                        System.out.println("clicked upperright regionbox");
                    }

                    //Lower Left Region Box
                    if ((e.getX() >= 1)
                    		&& (e.getX() <= markerSize)
                    		&& (e.getY() >= getHeight() - markerSize)
                    		&& (e.getY() <= getHeight() - 1)) {
                        System.out.println("clicked lowerleft regionbox");
                    }
                    //Lower Right Region Box
                    if ((e.getX() >= getWidth() - markerSize )
                    		&& (e.getX() <= getWidth() - 1)
                    		&& (e.getY() >= getHeight() - markerSize)
                    		&& (e.getY() <= getHeight() - 1)) {
                        System.out.println("clicked lowerright regionbox");
                    }

                }
            };
        };
    }
 
G

Guest

Gast
Das Problem ist die Koordinate, wo Du zum ersten Mal draufklickst.
Der Event liefert Dir lokale Koordinaten innerhalb der Komponente,
nicht die des übergeordneten Containers. Die relative Position musst
Du in Position innerhalb des Containers umrechnen.

Ich habe mal mit etwas ähnlichem experimentiert, allerdings habe ich
es so gelöst, dass der Container für das Verschieben zuständig ist.
Dadurch erfordern die zu verschiebenden Komponenten keinen speziellen
Code.
Auf zusätzliche Umrandung etc. habe ich hier verzichtet, damit es übersichtlich
bleibt.

Schau Dir am besten dieses vereinfachte Beispiel an.
Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class View extends JPanel implements MouseListener, MouseMotionListener
{
  private Component currentComponent;
  private int dx;
  private int dy;

  public View()
  {
    setLayout(null);
    setBackground(Color.white);
    addMouseListener(this);
    addMouseMotionListener(this);
    add(createPanel(100, 100, 50, 50, Color.BLUE));
    add(createPanel(200, 200, 50, 50, Color.GREEN));
  }

  private JPanel createPanel(int x, int y, int width, int height, Color color)
  {
    JPanel panel = new JPanel();
    panel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    panel.setBackground(color);
    panel.setBounds(x, y, width, height);
    return panel;
  }

  public void mousePressed(MouseEvent e)
  {
    // Komponente unter Cursor holen;
    currentComponent = getComponentAt(e.getX(), e.getY());
    if(currentComponent!=null && currentComponent!=this)
    {
      // Angeklickte Komponente in den Vordergrund setzen
      setComponentZOrder(currentComponent, 0);
      currentComponent.repaint();
      // Differenz der Klickposition zur Position der Komponente
      dx = e.getX()-currentComponent.getLocation().x;
      dy = e.getY()-currentComponent.getLocation().y;
    }
    else
      currentComponent = null; // damit sich der Container nicht selbst verschiebt ;-)
  }

  public void mouseDragged(MouseEvent e)
  {
    if(currentComponent!=null)
      currentComponent.setLocation(e.getX()-dx, e.getY()-dy); 
  }

  public void mouseReleased(MouseEvent e){}
  public void mouseClicked(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e)  {}
  public void mouseMoved(MouseEvent e)   {}

  public static void main(String[] args)
  {
    try
    {
      final JFrame f = new JFrame("");
      f.setSize(800,600);
      f.getContentPane().add(new View());
      f.setLocationRelativeTo(null);
      f.setVisible(true);
      f.addWindowListener(
        new WindowAdapter()
        {
          public void windowClosing(WindowEvent e)
          {
            f.setVisible(false);
            System.exit(0);
          }
        }
      );
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}
 

COBRA

Mitglied
Danke! :D Also schlagen sich auch andere mit solchen Problemen herum.

@Code: Verschieben ist einfacher hatte ich auch schon fertiggestellt.
Habe nur diesen Code entfernt vor dem posten.

Mein Problem ist ja die Größenänderung. Ich denke mein Problem liegt in der Berechnung der rellativen Mausverschiebung oder ???
Wenn ich ein wenig vorstellungsgabe hätte würde es mir sicher leichter fallen.

Kennt jemand ein kleineres Zeichenprogramm in Java mit Quellcode wo ich sehen kann wie so etwas andere machen. :roll: Wenn ich das dann verstehe sehe ich vielleicht auch mein Problem besser.

:### Cobra
 

COBRA

Mitglied
Nur wer es wissen will.
Habe das Problem heute gelöst nicht schön aber es funkt.

und hier der relevante Code.

Code:
    private void setMouseDragListener() {
        mouseDragListener = new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent e) {
            	int correctionWidth = 0;
            	int correctionHight = 0;

                if (isMarked && isMouseDown) {
                	// numberRegionBox
                    // 1.|------------------|2.
                    //   |_|             |_ |
                    //   |                  |
                    //   |                  |
                    //   |        0.        |
                    //   |                  |
                    //   |_                _|
                    //   | |              | |
                    // 4.|------------------|3.
                	switch (numberRegionBox) {
                	case NO_CORNER: // No Resize only reposition
	                	newBoundsResize(e);
	                	break;
                	case LEFT_UPPER_CORNER://Resize Upper Left Corner
	                	correctionWidth = oldWidth;
	                	correctionHight = oldHeight;
	                	break;
                	case RIGHT_UPPER_CORNER:	//Resize Upper Right Corner
	                		correctionWidth = 0;
	                		correctionHight = oldHeight;
	                	break;
                	case RIGHT_LOWER_CORNER:	//Resize Lower Right Corner
	                		correctionWidth = 0;
	                		correctionHight = 0;
	                	break;
                	case LEFT_LOWER_CORNER:	//Resize Lower Left Corner
	                		correctionWidth = oldWidth;
	                		correctionHight = 0;
	                	break;
	                default:
	                	newBoundsResize(e);
	                	break;

                	}
	                // resize direction branch
	                //   |------------------|
	                //   |        |         |
	                //   |   1.   |    2.   |
	                //   |        |         |
	                //   |------------------|
	                //   |        |         |
	                //   |   3.   |    4.   |
	                //   |        |         |
	                //   |------------------|
                	if (numberRegionBox != 0){ // Resize
                    	newBoundsResize(e, correctionWidth, correctionHight);
                	}
                    self.setLocation(newX, newY);
                    self.setSize(newWidth,newHeight);
                }
            }
        };
    }
		private void newBoundsResize(java.awt.event.MouseEvent e, int correctionWidth, int correctionHight ) {
            // resize direction branch
            //   |------------------|
            //   |        |         |
            //   |   1.   |    2.   |
            //   |        |         |
            //   |------------------|
            //   |        |         |
            //   |   3.   |    4.   |
            //   |        |         |
            //   |------------------|
			if (oldX - (self.getX() + e.getX()) + correctionWidth > 0) {
			   	if (oldY - (self.getY() + e.getY()) + correctionHight > 0) {
			   	   newX = self.getX() + e.getX();
			   	   newY = self.getY() + e.getY();
			   	   newWidth = oldX - (self.getX() + e.getX()) + correctionWidth;
			   	   newHeight = oldY - (self.getY() + e.getY())  + correctionHight;
			     } else {
			       	newX = self.getX() + e.getX();
			       	newY = oldY + correctionHight;
			       	newWidth = oldX - (self.getX() + e.getX()) + correctionWidth;
			       	newHeight = e.getY();
			     }
			} else {
			  	if (oldY - (self.getY() + e.getY()) + correctionHight > 0) {
			       	newX = oldX + correctionWidth;
			       	newY = self.getY() + e.getY();
			       	newWidth = e.getX();
			       	newHeight = oldY - (self.getY() + e.getY()) + correctionHight;
			    } else {
			       	newX = oldX + correctionWidth;
			       	newY = oldY + correctionHight;
			       	newWidth = e.getX();
			       	newHeight = e.getY();
			    }
			}
		}

		private void newBoundsResize(java.awt.event.MouseEvent e ) {
			newX = self.getX() + (e.getX() - clickX);
			newY = self.getY() + (e.getY() - clickY);
			newWidth =  oldWidth;
			newHeight = oldHeight;
		}

    
    
    private void setMouseDownListener() {
        mouseDownListener = new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent e) {
                //System.out.println("OnObject9 -> mouseDown()");
                if (!isMovable) {
                    return;
                }
                if (!isSizable) {
                    return;
                }

                setIsMouseDown(true);
                System.out.println("MouseDown X " + e.getX());
                System.out.println("MouseDown Y " + e.getY());
                oldX = self.getX();//+e.getX();
                oldY = self.getY();//+e.getY();
                clickX = e.getX();
                clickY = e.getY();
                oldWidth = self.getWidth();
                oldHeight = self.getHeight();
                if (isMarked) {
                    System.out.println("x == " + e.getX() + " - y == " + e.getY());
                    //Upper Left Region Box
                    numberRegionBox = 0;
                    if ((e.getX() >= 1)
                    		&& (e.getX() <= markerSize)
                    		&& (e.getY() >= 1)
                    		&& (e.getY() <= markerSize)) {
                        System.out.println("clicked upperleft regionbox");
                        numberRegionBox = 1;
                    }
                    //Upper Right Region Box
                    if ((e.getX() >= getWidth() - markerSize)
                    		&& (e.getX() <= getWidth() - 1)
                    		&& (e.getY() >= 1)
                    		&& (e.getY() <= markerSize)) {
                        System.out.println("clicked upperright regionbox");
                        numberRegionBox = 2;                        
                    }

                    //Lower Left Region Box
                    if ((e.getX() >= 1)
                    		&& (e.getX() <= markerSize)
                    		&& (e.getY() >= getHeight() - markerSize)
                    		&& (e.getY() <= getHeight() - 1)) {
                        System.out.println("clicked lowerleft regionbox");
                        numberRegionBox = 4;
                    }
                    //Lower Right Region Box
                    if ((e.getX() >= getWidth() - markerSize)
                    		&& (e.getX() <= getWidth() - 1)
                    		&& (e.getY() >= getHeight() - markerSize)
                    		&& (e.getY() <= getHeight() - 1)) {
                        System.out.println("clicked lowerright regionbox");
                        numberRegionBox = 3;
                    }
                }
            };
        };
    }

:D COBRA
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Absolute path funktioniert nicht Java Basics - Anfänger-Themen 5
O Absolute Pfade in mehrere Klassen verwenden Java Basics - Anfänger-Themen 3
L Manifest und absolute Pfade Java Basics - Anfänger-Themen 5
T Aufrufen von get-Methode aus anderer Klasse (absolute Anfängerfrage) Java Basics - Anfänger-Themen 2
B Relative/Absolute Pfadangabe. Wie unterscheiden? Java Basics - Anfänger-Themen 4
G absolute Häufigkeit Java Basics - Anfänger-Themen 13
H Absolute null ersetzen Java Basics - Anfänger-Themen 2
L absolute beginner . wie klassen strukturieren Java Basics - Anfänger-Themen 2
P Absolute Verzweiflung: Linux + Java + CLASSPATH Java Basics - Anfänger-Themen 8
S Wie bekomme ich absolute Werte (Betrag einer Zahl)? Java Basics - Anfänger-Themen 5
CptK Interface Cursor ändern Java Basics - Anfänger-Themen 8
B Wie instanzisiert man einen Cursor richtig? Java Basics - Anfänger-Themen 3
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
H Cursor-Position bei Rechtsclick? Java Basics - Anfänger-Themen 2
D Cursor Verschiebung. Java Basics - Anfänger-Themen 19
D Cursor Verschiebung Java Basics - Anfänger-Themen 3
L Farbe unter Cursor bestimmen Java Basics - Anfänger-Themen 5
H Cursor in JTable Java Basics - Anfänger-Themen 8
R Übersetzung von Secondary Cursor Java Basics - Anfänger-Themen 7
J Escape taste geht ohne cursor im textfeld nicht. Java Basics - Anfänger-Themen 4
J Cursor verschwindet Java Basics - Anfänger-Themen 2
0 Wie kann ich den Text-Cursor ändern? Java Basics - Anfänger-Themen 2
M Cursor in welchem TextPane? Java Basics - Anfänger-Themen 5
M Cursor Koordinaten ändern Java Basics - Anfänger-Themen 4
P Cursor unsichtbar machen Java Basics - Anfänger-Themen 5
S Cursor Form und oder Farbe verändern, geht das???? Java Basics - Anfänger-Themen 4
G Button drücken und Cursor-Sprünge Java Basics - Anfänger-Themen 8
P textfeld und cursor Java Basics - Anfänger-Themen 7
E Cursor Image bei Drag'n'Drop ändern Java Basics - Anfänger-Themen 6
R in einer TextArea den Cursor gleich anzeigen lassen Java Basics - Anfänger-Themen 3
R Cursor auf TextField Java Basics - Anfänger-Themen 4
P Cursor in Konsole positionieren Java Basics - Anfänger-Themen 5
B Cursor bestimmen Java Basics - Anfänger-Themen 4
L px und x-position Java Basics - Anfänger-Themen 4
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
J Itext-Paragraph Position ändern Java Basics - Anfänger-Themen 13
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
I Eigenschaften von Position aus anderer Klasse übernehmen Java Basics - Anfänger-Themen 17
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
H Position verschieben der Elemtente im Array Java Basics - Anfänger-Themen 3
J Eingabe des Scanners an einer bestimmten Position Java Basics - Anfänger-Themen 6
S Position eines Frames Java Basics - Anfänger-Themen 3
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
T Arrayposition um eine Position verschieben Java Basics - Anfänger-Themen 2
V Klassen Bestimmen Sie die erste und letzte Position an der ein 'c' steht? Java Basics - Anfänger-Themen 3
R Position einer Ziffer in einer Zahlenkette Java Basics - Anfänger-Themen 5
V Datentypen Position mit Int und Float berechen und ausgeben Java Basics - Anfänger-Themen 5
Z Wie Position eines Objekts in Liste herausfinden? Java Basics - Anfänger-Themen 15
C Position eines Zeichens in einem String ausgeben Java Basics - Anfänger-Themen 1
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
I Int Array, Zahl an bestimmte position setzten Java Basics - Anfänger-Themen 2
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
O Position des Buttons wird nicht geändert.. Java Basics - Anfänger-Themen 6
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
S Maus Position Java Basics - Anfänger-Themen 6
A Eine Datei Lesen und bestimmte Position überschreiben Java Basics - Anfänger-Themen 2
S JSplitPane Divider Maximum Position Java Basics - Anfänger-Themen 5
W Position in ArrayList ermitteln Java Basics - Anfänger-Themen 4
M kurze frage: Ohne index.of position von string angeben Java Basics - Anfänger-Themen 16
M Input/Output position in temporären dateien kann nicht gesetzt werden Java Basics - Anfänger-Themen 3
E Y-Position der Maus nehmen Java Basics - Anfänger-Themen 5
R mit DefaultStyledDocument die Caret-Position ändern? Java Basics - Anfänger-Themen 5
V Position in einem Vektor Java Basics - Anfänger-Themen 3
M LinkedList aktuelle position Java Basics - Anfänger-Themen 3
E Position erkennen und überlappungen feststellen Java Basics - Anfänger-Themen 4
M Fixe Position von GUI Komponenten ? Java Basics - Anfänger-Themen 9
B JMenu Position bestimmen Java Basics - Anfänger-Themen 7
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
TheKing Spieler Position mit Array vergleichen Java Basics - Anfänger-Themen 2
T Image Position erkennen Java Basics - Anfänger-Themen 6
L die Position von Suchtreffern von Lucene finden Java Basics - Anfänger-Themen 2
S Datentypen In ArrayList nach Element suchen und Position ausgeben Java Basics - Anfänger-Themen 9
K Kreis mit neuer Position zeichnen Java Basics - Anfänger-Themen 3
S OOP Wie bei Spiel "17+4" eine Karte an bestimmte Position hinzufügen Java Basics - Anfänger-Themen 13
M Zufällige Position Java Basics - Anfänger-Themen 3
A Elemente 2er int[] auf Gleichheit und Position überprüfen Java Basics - Anfänger-Themen 7
M Position des BufferedReader Java Basics - Anfänger-Themen 6
J Programm-Fesnter Position Java Basics - Anfänger-Themen 4
O Maus / Pixel Position bei mir und bei anderen. Java Basics - Anfänger-Themen 8
F Position JTextField Java Basics - Anfänger-Themen 4
B aktuelle Position einer JTextArea ermitteln Java Basics - Anfänger-Themen 6
C Position eines Fensters bestimmen Java Basics - Anfänger-Themen 3
H problem mit button position Java Basics - Anfänger-Themen 4
G Bestimmte Position im array auslesen Java Basics - Anfänger-Themen 8
M Array, Int-wert Ziffer je Position zuweisen Java Basics - Anfänger-Themen 3
B String vom Server nach Position... (erledigt) Java Basics - Anfänger-Themen 6
H Exception: illegal component position Java Basics - Anfänger-Themen 5
G Position eines Objekts auf Webseite herausfinden Java Basics - Anfänger-Themen 9
hdi Grösse & Position von JScrollBar Java Basics - Anfänger-Themen 28
G TrayIcon: Wie aktuelle Position des Icons erhalten? Java Basics - Anfänger-Themen 2
D Fensterrahmen und Position ändern. Java Basics - Anfänger-Themen 5
M Maus position abfragen und setzen? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben