السلام عليكم ورحمة الله وبركاته
لقد قمت باستخدام ال mouselisener لرسم مجموعة من النقاط في مكان الذي يضغط فيه المستخدم يقوم برسم نقطة ويخزنها في Array list
وبعد الانتهاء من رسم النقاط اردت اذا سحب المستخدم نقطة الى مكان معين يقوم بمسح الاولى ورسم التانية وتخزين الجديدة في المصفوفة
لكن المشكلة في البرنامج انه اولا لا يقوم بحذف الاولى بالرغم من استخدام
vert.set(i,new Ellipse2D.Double(x, y, 15, 15));
علما بان i i هي ال index في المصفوفة للعنصر الذي تم تحريكه واقوم بالحصول عليها
من خلال الميثود
///to find which node is move
public static int serch_inArray(int x,int y){
for(int i=0;i<vert.size();i++){
if(vert.get(i).getX()==x&&vert.get(i).getY()==y)
return i;
}
return -1;
}والاحداثيات التي ترسل له من خلال الماوس dragg
اي ان البرنامج عند الضغط بالماوس يرسم نقطة وعند سحب النقطة احداثيات القديمة ياخدها من ماوس dragg ويبحث عن النقطة التي نريد تغيرها ومن خلال moseRelase المكان الجديد
والمشكلة انه لا يحذف القديمة ويكرر في رسم النقاط
لانه ال moseRelase يتم استدعاءه اكثر من مرة في وقت غير مطلوب اي في وقت لا اريد تغير النقاط وانما اكون ارسم فاي من ميثود الماوس يكون انسب للحصول على الاحداثيات الجديدة
وهذا الكود بالكامل
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
public class TestPanelDrawing2 extends JPanel implements MouseListener ,MouseMotionListener{
static int i;
static int x;
static int y;
static ArrayList<Ellipse2D.Double> vert = new ArrayList<Ellipse2D.Double>();
///to find which node is move
public static int serch_inArray(int x,int y){
for(int i=0;i<vert.size();i++){
if(vert.get(i).getX()==x&&vert.get(i).getY()==y)
return i;
}
return -1;
}
public void mouseDragged(MouseEvent e) {
x=e.getX();
y=e.getY();
i=serch_inArray(x,y);
}
public void mouseMoved (MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
drawNode();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
x = e.getX();
y = e.getY();
System.out.println (x);
vert.set(i,new Ellipse2D.Double(x, y, 15, 15));
drawNode();
}
@Override
public void mouseExited(MouseEvent e) {
}
public TestPanelDrawing2() {
addMouseListener(this);
}
public void drawNode() {
Graphics g = getGraphics();
Graphics2D g2 = (Graphics2D) g;
int x1 = TestPanelDrawing2.x;
int y1 = TestPanelDrawing2.y;
Ellipse2D.Double a = new Ellipse2D.Double(x1 + 5, y1, 15, 15);
TestPanelDrawing2.vert.add(a);
for (int i = 0; i < vert.size(); i++) {
Ellipse2D.Double d = vert.get(i);
g2.draw(d);
g.drawString((char) (65 + i) + "", (int) (d.x + 5), (int) d.y);
g2.fill(new Ellipse2D.Double(d.x, d.y, 15, 15));
}
}
public static void main(String[] args) {
TestPanelDrawing2 p = new TestPanelDrawing2();
JFrame frame = new JFrame();
frame.add(p);
frame.setTitle("TestPanelDrawing");
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setVisible(true);
}
}