gezeichnete Punkte dynamisch verschieben mit mousedragged

Status
Nicht offen für weitere Antworten.

manni

Mitglied
Hallo,

ich schreibe gerade eine Java Applikation, bei der ich gezeichnete Punkte mittels gedrückter Maustaste verschieben möchte.

Dazu verwende ich die Methode mousedragged, die dann eine weitere Methode "changePoint" aufruft, die zuerst nachsieht, ob ich in der Nähe eines bestehenden Punktes geklickt habe, und erst dann weitere Berechnungen ausführt...usw.
Das funktioniert soweit auch, das Problem ist nur, wenn ich den Punkt zu schnell bewege, dann "verliert" er sozusagen den zu bewegenden Punkt.
Halte ich die Maustaste weiter gedrückt und fahre zurück zur letzten Position, dann kann ich den Punkt weiterbewegen.

Hat jemand eine Idee, wie ich das Problem beheben kann?

Code-Auszug:
Code:
       public synchronized void mouseDragged(MouseEvent event)
         {
         	m_ClickX = event.getX();
         	m_ClickY = event.getY();
         	System.out.println("drag");
        	m_Canvas.changePoint(m_ClickX,m_ClickY);
         }

Code:
		public synchronized boolean changePoint(int PosX, int PosY) {
			m_Point = new PointCP(PosX,PosY); 
			System.out.println("drag: "+PosX+" "+PosY);
			if (m_PointList.size()>3 && m_CHpoints>3) { // remove is only allowed, when a minimum of 3 points left
				for (int i=0;i<m_PointList.size();i++) {
					for (int a=-4;a<=4;a++) {
						for (int b=-4;b<=4;b++){
							if(m_Point.getX()+a==((PointCP)m_PointList.get(i)).getX() &&
									m_Point.getY()+b==((PointCP)m_PointList.get(i)).getY()) {
								System.out.println("drag");
								((PointCP)m_PointList.get(i)).setX(m_Point.getX()); 
								((PointCP)m_PointList.get(i)).setY(m_Point.getY()); 
								SEC_CHull();
								repaint(); // repaints the JCanvas
								break;
							}
						}
					}
				}
			}
 

André Uhres

Top Contributor
manni hat gesagt.:
...Dazu verwende ich die Methode mousedragged, die dann eine weitere Methode "changePoint" aufruft,
die zuerst nachsieht, ob ich in der Nähe eines bestehenden Punktes geklickt habe...
Nachsehen, ob du in der Nähe eines bestehenden Punktes geklickt hast ist ja schon notwendig.
Aber das darfst du nicht in mousedragged machen, sondern in mousePressed.

Dazu musst du zusätzlich zum MouseMotionListener einen MouseListener hinzufügen.
In mousePressed setzt du eine boolsche Variable die angibt ob ein Punt zu bewegen ist oder nicht
und berechnest auch die Position des Mauszeigers relativ zu dem Punkt in dessen Nähe er ist (deltaX, deltaY).

In mousedragged fragst du dann die boolsche Variable ab und berechnest die neue Position
mit Hilfe von deltaX und deltaY. Hoffe das hilft.
Code:
/*
 * PunktVerschieben2.java
 */
//package paint;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PunktVerschieben2 extends JFrame {
    public PunktVerschieben2() {
        super("Punkt verschieben");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,400);
        setLocationRelativeTo(null);
        punktPanel = new PunktPanel();
        add(punktPanel);
    }
    public static void main(String args[]){new PunktVerschieben2().setVisible(true);}
    private PunktPanel punktPanel;
    class PunktPanel extends JPanel implements MouseListener, MouseMotionListener{
        public PunktPanel(){
            addMouseListener(this);
            addMouseMotionListener(this);
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawPolygon(new int[]{x1, x2, x3}, new int[]{y1, y2, y3}, 3);
        }
        private void setPumkt(int x, int y){
            switch(p){
                case 1:{x1 = x; y1 = y; break;}
                case 2:{x2 = x; y2 = y; break;}
                case 3:{x3 = x; y3 = y; break;}}
            repaint();
        }
        public void mouseDragged(MouseEvent e) {
            if(move) setPumkt(e.getX()+deltaX, e.getY()+deltaY);
        }
        public void mouseMoved(MouseEvent e) {}
        public void mouseClicked(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {
            int xP = e.getX();
            int yP = e.getY();
            move = false;
            if(xP > x1-10 && xP < x1+10 && yP > y1-10 && yP < y1+10){
                deltaX = x1-xP; deltaY = y1-yP; move = true; p=1;
            }else if(xP > x2-10 && xP < x2+10 && yP > y2-10 && yP < y2+10){
                deltaX = x2-xP; deltaY = y2-yP; move = true; p=2;
            }else if(xP > x3-10 && xP < x3+10 && yP > y3-10 && yP < y3+10){
                deltaX = x3-xP; deltaY = y3-yP; move = true; p=3;
            }
        }
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        private int x1=200, y1=30, x2=200, y2=200, x3=300, y3=300, deltaX, deltaY, p;
        private boolean move;
    }
}
 

manni

Mitglied
Ich habe schon eine Methode mousepressed, die verwende ich um bei Klick einen Punkt zu setzen, und bei rechts-Klick einen Punkt zu löschen!
Aber jetzt möchte ich diese Punkte dynamisch am Bildschirm verschieben.
Da jeder Punkt Ecke eines Polygons ist, werden die Kanten gleich neu berechnet und das wird sofort dargestellt, d.h. die Linien bewegen sich mit dem Punkt mit.

Ich möchte also die Punkte bewegen und ziehe dabei die Polygonlinien wie ein Gummiband mit!

Deshalb bin ich mir jetzt nicht sicher, ob mir dein Tipp schon hilft?
 

Leroy42

Top Contributor
Früher bei den langsamen GUI's war das nicht so einfach. Man mußte erst die alte
Linie mit einer XOR-Verknüpfung überschreiben und dann die neue Linie zeichnen.

Heutzutage kannst du dir das schenken und via repaint() die GUI einfach anweisen,
alles neu zu zeichnen.

Du brauchst also nur in der mouseDragged Methode die Koordinate des Punktes
den du in der mousePressed Methode selektiert hattest speichern und alles neu zeichnen.
 

André Uhres

Top Contributor
manni hat gesagt.:
...Ich möchte also die Punkte bewegen und ziehe dabei die Polygonlinien wie ein Gummiband mit!
Deshalb bin ich mir jetzt nicht sicher, ob mir dein Tipp schon hilft?
Ob du einen fillOval oder einen drawPolygon machst dürfte ziemlich egal sein.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Gezeichnete Linine verschwinden AWT, Swing, JavaFX & SWT 7
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
K Swing JPanel auf gezeichnete Fläche legen AWT, Swing, JavaFX & SWT 4
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
D gezeichnete bilder verblassen AWT, Swing, JavaFX & SWT 10
M Gezeichnete graphic in JTabbedPanel AWT, Swing, JavaFX & SWT 2
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
R eine gezeichnete graphik speichern. AWT, Swing, JavaFX & SWT 15
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
G JavaFX Projection von 3D Punkte auf 2D Punkte AWT, Swing, JavaFX & SWT 0
Soloeco Graphics2D - Verbinden zweier Punkte AWT, Swing, JavaFX & SWT 6
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
M Punkte malen AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Punkte um Mittelpunkt drehen AWT, Swing, JavaFX & SWT 11
J Reihenfolge der Punkte in Vielecken AWT, Swing, JavaFX & SWT 3
N 2D-Grafik AffineTransform - Punkte abfragen nach transform() AWT, Swing, JavaFX & SWT 3
E 2D-Grafik Div. Punkte zur Sinuskurve verbinden AWT, Swing, JavaFX & SWT 25
B unsortierte Punkte verbinden AWT, Swing, JavaFX & SWT 8
K Punkte eines Funktionsplotters zeitlich versetzt zeichnen AWT, Swing, JavaFX & SWT 18
K swing/awt Panel punkte malen AWT, Swing, JavaFX & SWT 4
P Welche Methode um Punkte in xy Ebene zu zeichnen? AWT, Swing, JavaFX & SWT 4
L Punkte verbinden AWT, Swing, JavaFX & SWT 3
W Punkte im JLabel AWT, Swing, JavaFX & SWT 7
H Punkte im Kreis AWT, Swing, JavaFX & SWT 3
E Mysthische Punkte auf JFrame(FlowLayout) nach Komboboxklick AWT, Swing, JavaFX & SWT 5
K Punkte in eine bestimmte Richtung bewegen AWT, Swing, JavaFX & SWT 5
H Punkte auf einem JPanel zeichnen AWT, Swing, JavaFX & SWT 4
V Punkte malen im Panel AWT, Swing, JavaFX & SWT 3
G Punkte auf Canvas zeichnen AWT, Swing, JavaFX & SWT 2
W JavaFX Farben dynamisch anpassen AWT, Swing, JavaFX & SWT 4
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
A Swing JPanels dynamisch untereinander einfügen AWT, Swing, JavaFX & SWT 3
Wurstsemmel SWT MenuItem dynamisch hinzufügen AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
MaxG. Swing Dynamisch grafische Objekte erzeugen AWT, Swing, JavaFX & SWT 12
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
S CombinedDomainXYPlot und dynamisch hinzugefügte subplots: Darstellungsprobleme AWT, Swing, JavaFX & SWT 3
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
llabusch JavaFX Dynamisch alles vergrößern (wie im Browser) AWT, Swing, JavaFX & SWT 3
agent47 JavaFX TreeView Struktur dynamisch einlesen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
D JavaFX Dynamisch erzeugte Checkboxen aus VBox auslesen AWT, Swing, JavaFX & SWT 3
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
I JTable dynamisch aus ArrayList befüllen AWT, Swing, JavaFX & SWT 3
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
G FormLayout dynamisch wachsend AWT, Swing, JavaFX & SWT 0
T JTable dynamisch mit ArrayList AWT, Swing, JavaFX & SWT 2
A Swing Logikaufgabe: Zeilenanzahl einer JTable mit 3d String dynamisch anpassen AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
P TableViewerColumn dynamisch erzeugen AWT, Swing, JavaFX & SWT 3
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
C Swing CardLayout dynamisch erweitern AWT, Swing, JavaFX & SWT 11
B Link eines Icons dynamisch gestalten AWT, Swing, JavaFX & SWT 2
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
P Gifs dynamisch auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E Breite eines JButton dynamisch ändern AWT, Swing, JavaFX & SWT 3
P Swing Dynamisch zeichnen mit Shapes wie Rectangle2D.Float ? AWT, Swing, JavaFX & SWT 6
C SWT - widget dynamisch erzeugen und anzeigen AWT, Swing, JavaFX & SWT 10
C Tooltip dynamisch setzen AWT, Swing, JavaFX & SWT 7
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
X jTextFields dynamisch initialisieren AWT, Swing, JavaFX & SWT 2
A Swing Dynamisch Objekte erzeugen AWT, Swing, JavaFX & SWT 3
L Label dynamisch awt AWT, Swing, JavaFX & SWT 2
H Swing Symbol in Taskleiste dynamisch aus- bzw. einblenden AWT, Swing, JavaFX & SWT 14
B JTabbedPane mit Enumeration dynamisch füllen AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
J Java 2D - dynamisch zeichnen AWT, Swing, JavaFX & SWT 4
A AWT HSB-Farben dynamisch berechnen AWT, Swing, JavaFX & SWT 5
P Dynamisch Sortieren AWT, Swing, JavaFX & SWT 2
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
Airwolf89 Swing Dynamisch auf Objekte in einer GUI zugreifen AWT, Swing, JavaFX & SWT 10
Airwolf89 Swing Tabs dynamisch ausblenden AWT, Swing, JavaFX & SWT 3
H Swing Register (jTabbedPane) dynamisch hinzufügen? AWT, Swing, JavaFX & SWT 7
Airwolf89 Swing Anzahl der Tabellenspalten dynamisch setzen AWT, Swing, JavaFX & SWT 2
S SWT WizardPage - Button anzeigen und Text-Widgets dynamisch aktualisieren AWT, Swing, JavaFX & SWT 12
R JLabel und JSlider dynamisch erzeugen? AWT, Swing, JavaFX & SWT 3
W Swing dynamisch Buttons in JEditorPane erstellen AWT, Swing, JavaFX & SWT 2
Pithecanthropus Swing JPanels dynamisch austauschen AWT, Swing, JavaFX & SWT 8
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
Spot84 jtable mit checkboxnode dynamisch per arraylist füllen AWT, Swing, JavaFX & SWT 8
bugmenot Dynamisch erzeugte jLabels werden nicht angezeigt. AWT, Swing, JavaFX & SWT 5
ABstraCT JCombobox dynamisch füllen (erstes Element Problem) AWT, Swing, JavaFX & SWT 4
J JLabels usw. dynamisch anlegen AWT, Swing, JavaFX & SWT 8
A JList dynamisch vergrößern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben