الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

move graph

بدأه ريحانة الاقصى في 3 مايو 2011 · 15 رد · 795 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لقد قمت باستخدام ال 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);
        }
}
#2

مرحبا ريحانة طبعا انا مش خبيرة بس اعتقد انه الخطأ عندك هو استخدامك للميثود mouseDragged لتحديد i

والمفروض تستخديمي mousePressed لانه اذا استخدمتي dragged فانه راح يحط قيمة i = اخر موقع للماوس (موقع النقطة الجديد)

وهاي وجهة نظري جربيها

نقطة اخرى بما انك بتحددي النود المختارة عن طريق الكود

if(vert.get(i).getX()==x&&vert.get(i).getY()==y)

فانه لن يعطيكي النتيجة الصحيحة الا اذا المستخدم ضغط في مركز النود تماما لذلك لازم توضعي مدى معين للاحداثيات تعتمد على نصف قطر النود

اسمعي ولي لا تضحكي علي طيب ^_^

2
#3

+1

كلامك سليم جدا

وانتى احسن من الخبيرة :)

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#4

تسلم اخي هاي اول مرة بتزبط معي :happy:

#5

شكرا جزيلا على الرد بالذات

  if(vert.get(i).getX()==x&&vert.get(i).getY()==y)

لم اكن منتبه لها ...ولكن mousePressed لا تفي بالغرض لانه عندما استبدلها فيها لم يحدث شي

#6

استبدلت الامر

ب

                   if(vert.get(i).getX()<=x+25&&vert.get(i).getX()>=x-25&&vert.get(i).getY()<=x+25&&vert.get(i).getY()>=x-25)

لاعطاء مدى معقول بدل من الضغط بالمنتصف

               Ellipse2D.Double a = new Ellipse2D.Double(x1 + 5, y1, 15, 15);

ولكن لا يزال يظهر

       Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
215

اي انه دائما يرجع -1

#7

طيب جربي الميثود

(contain(x,y

#8

غيرت هذه الدالة وظبط معى الكود

@Override
	public void mouseReleased(MouseEvent e) {
    	x = e.getX();
    	y = e.getY();
    	System.out.println(x);
    	vert.add(new Ellipse2D.Double(x, y, 15, 15));
    	System.out.println(x);
    	drawNode();
	}

post-165385-047281700 1304457646_thumb.p

المرفقات
8888.png

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 4 مايو 2011 في 00:20


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#9
       @Override
	public void mouseReleased(MouseEvent e) {
    	x = e.getX();
    	y = e.getY();
    	System.out.println(x);
    	vert.add(new Ellipse2D.Double(x, y, 15, 15));
    	System.out.println(x);
    	drawNode();
	}

ولكن هنا انت تضيف في موقع جديد انا اريد الاضافة تكون بدلا من العنصر الاول حتى يتم حذفه ولكن الظاهر المشكلة في تحديد العنصر الذي تم الضغط عليه ساحاول مرة اخرى لتحديده

شكرا

#10

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#11

لقد تمكنت من التعرف على النقطة التي اريد تغير موقعها بعد جهد

ولكن المشكلة انه لا يقوم بحدف السابقة رغم استخدام

             vert.set(i,new Ellipse2D.Double(x, y, 15, 15));

وقيمة i صحيحة وتتبع البرنامج يدل على حذفها من المصفوفة ولكن ما تزال ترسم ولا اعرف لماذا

كيف احذفها من الرسم

    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>();
         //static ArrayList<Integer> xCoordinate = new ArrayList<Integer>();
         //static ArrayList<Integer> yCoordinate = new ArrayList<Integer>();
         public static boolean isdragg=false;

    ///to find which node is move
            public static  int serch_inArray(int x,int y){
            System.out.println("send x"+x);
            System.out.println("send y"+y);
            System.out.println("size vert== "+vert.size());	
      	    for(int i=0;i<vert.size();i++){

      	    System.out.println("vert x"+vert.get(i).getX());
      	    System.out.println("vert y"+vert.get(i).getY());

      		if(vert.get(i).getX()<=x+20){
      		    System.out.println("truo");
      		if(vert.get(i).getX()>=x-20){
      	          System.out.println("truo");
      		if(vert.get(i).getY()<=y+20){
      			 System.out.println("truo");  	
      		if(vert.get(i).getY()>=y-20){
      			 System.out.println("truo");
      		      		return i;
      	         }}}}
      	    }
      	return -1;
      }

        public void mouseDragged(MouseEvent e) {
               isdragg=true;
                	 x=e.getX();
                     y=e.getY();
               //	System.out.println ("d"+x);

                }

        public void mouseMoved (MouseEvent e) {

        	}


        @Override
        public void mouseClicked(MouseEvent e) {
        if(isdragg==false){

        x = e.getX();
        y = e.getY();
        System.out.println("c"+x);	
        drawNode();

        }}

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {

        	 x=e.getX();
             y=e.getY();

             System.out.println("p x"+x);	
              System.out.println("p y"+y);
              	 i=serch_inArray(x,y);
        	System.out.println("i"+i);	

        }

        @Override
        public void mouseReleased(MouseEvent e) {
        if(isdragg==true){

         x = e.getX();
         y = e.getY();

        System.out.println("xp"+vert.get(i).getX()); 
         vert.set(i,new Ellipse2D.Double(x, y, 15, 15));
         System.out.println("xaft"+vert.get(i).getX());
        System.out.println("r"+x);

        drawNode();	

        }}


        @Override
        public void mouseExited(MouseEvent e) {
        }

        public TestPanelDrawing2() {
        addMouseListener(this);
        addMouseMotionListener(this);
        }

        public void drawNode() {

        Graphics g = getGraphics();
        Graphics2D g2 = (Graphics2D) g;
        int x1 = TestPanelDrawing2.x;
        int y1 = TestPanelDrawing2.y;

        if(isdragg==false){
         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));
        }

      if(isdragg==true){
        for (int i = 0; i < vert.size(); i++) {	
        System.out.println("x"+vert.get(i).getX()); }}

        }

        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);
        }
}
#12

السلام عليكم

انا حليت لك المشكله الخاصه بالحذف والمشكله التى كانت تنتج عن التكرار

المشكله كانت تكمن فى انك تقومى باضافه النود الجديده داخل الداله drawNode

ايضا المشكله التانيه انك بترسمى داخل داله الـ drawNode فبالتالى لا يمكنك عمل repaint

فالافضل ان تقومى بالرسم داخل داله الـ paint وهذا ما قومت به

ثانى شىء انك المفروض عندما تفعلى الحدث mouseClicked

ان تضغى isdragg = false; وبعدها تقومى باضافه النود الجديده

واضفت لكى خاصيه حذف نود عن طريق الزر الايمن للموس

هذا هو الكود

جعلت فقط جمل الطباعه كتعليق يمكنك تعديلها بعد ذلك

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>();
	//static ArrayList<Integer> xCoordinate = new ArrayList<Integer>();
	//static ArrayList<Integer> yCoordinate = new ArrayList<Integer>();
	public static boolean isdragg = false;

	///to find which node is move
	public static int serch_inArray(int x, int y) {
//    	System.out.println("send x" + x);
//    	System.out.println("send y" + y);
//    	System.out.println("size vert== " + vert.size());
    	for (int i = 0; i < vert.size(); i++) {

//        	System.out.println("vert x" + vert.get(i).getX());
//        	System.out.println("vert y" + vert.get(i).getY());

        	if (vert.get(i).getX() <= x + 20) {
//            	System.out.println("truo");
            	if (vert.get(i).getX() >= x - 20) {
//                	System.out.println("truo");
                	if (vert.get(i).getY() <= y + 20) {
//                    	System.out.println("truo");
                    	if (vert.get(i).getY() >= y - 20) {
//                        	System.out.println("truo");
                        	return i;
                    	}
                	}
            	}
        	}
    	}
    	return -1;
	}

	public void mouseDragged(MouseEvent e) {
    	isdragg = true;
    	x = e.getX();
    	y = e.getY();
    	repaint();

	}

	public void mouseMoved(MouseEvent e) {
	}

	@Override
	public void mouseClicked(MouseEvent e) {
    	x = e.getX();
    	y = e.getY();
    	if (e.getButton() == MouseEvent.BUTTON1) {
        	isdragg = false;
        	Ellipse2D.Double a = new Ellipse2D.Double(x + 5, y, 15, 15);
        	TestPanelDrawing2.vert.add(a);
    	} else if (e.getButton() == MouseEvent.BUTTON3) {
        	i = serch_inArray(x, y);
        	vert.remove(i);
    	}
    	repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
    	x = e.getX();
    	y = e.getY();
//    	System.out.println("p x" + x);
//    	System.out.println("p y" + y);
    	i = serch_inArray(x, y);
//    	System.out.println("i" + i);
    	repaint();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
    	if (isdragg == true) {
        	x = e.getX();
        	y = e.getY();
        	if (!vert.isEmpty()) {
            	if ((i >= 0 || i < vert.size()) && i != -1) {
//                	System.out.println("xp" + vert.get(i).getX());
                	vert.set(i, new Ellipse2D.Double(x, y, 15, 15));
//                	System.out.println("I = " + i);
//                	System.out.println("xaft" + vert.get(i).getX());
//                	System.out.println("r" + x);
                	repaint();
            	}
        	}
    	}
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	public TestPanelDrawing2() {
    	addMouseListener(this);
    	addMouseMotionListener(this);
	}

	@Override
	public void paint(Graphics g) {
    	super.paint(g);
    	Graphics2D g2 = (Graphics2D) g;

    	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);
	}
}
1

Software Developer
Mahmoudkelany.com


 

#13

شكررررررررررررررررررررررا جزيلا ولكن

ما الفرق بين e.getButton() == MouseEvent.BUTTON1

e.getButton() == MouseEvent.BUTTON3

#14

BUTTON1 هو زر الموس الايسر

BUTTON2 هو زر الموس الاوسط او البكرة او الزر الايسر والايمن معا

BUTTON3 هو زر الموس الايمن

1

Software Developer
Mahmoudkelany.com


 

#15

MouseEvent.BUTTON1 يمثل ال left click

MouseEvent.BUTTON2 يمثل ال mouse wheel

MouseEvent.BUTTON3 يمثل ال right click

وهذا كود للتأكد جربه واستخدم الفارة وتابع الجمل المطبوعة

import java.awt.event.MouseEvent;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * NewJFrame.java
 *
 * Created on 06/05/2011, 09:30:58 م
 */

/**
 *
 * @author nour_3eny
 */
public class NewJFrame extends javax.swing.JFrame {

	/** Creates new form NewJFrame */
	public NewJFrame() {
    	initComponents();
	}

	/** This method is called from within the constructor to
 	* initialize the form.
 	* WARNING: Do NOT modify this code. The content of this method is
 	* always regenerated by the Form Editor.
 	*/
	@SuppressWarnings("unchecked")
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

    	setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    	addMouseListener(new java.awt.event.MouseAdapter() {
        	public void mousePressed(java.awt.event.MouseEvent evt) {
            	formMousePressed(evt);
        	}
    	});

    	javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    	getContentPane().setLayout(layout);
    	layout.setHorizontalGroup(
        	layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        	.addGap(0, 598, Short.MAX_VALUE)
    	);
    	layout.setVerticalGroup(
        	layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        	.addGap(0, 380, Short.MAX_VALUE)
    	);

    	pack();
	}// </editor-fold>

	private void formMousePressed(java.awt.event.MouseEvent evt) {
    	if(evt.getButton() == MouseEvent.BUTTON1){
        	System.out.println("button 1");
    	}else if(evt.getButton() == MouseEvent.BUTTON2){
        	System.out.println("button 2");
    	}else if(evt.getButton() == MouseEvent.BUTTON3){
        	System.out.println("button 3");
    	}
	}

	/**
	* @param args the command line arguments
	*/
	public static void main(String args[]) {
    	java.awt.EventQueue.invokeLater(new Runnable() {
        	public void run() {
            	new NewJFrame().setVisible(true);
        	}
    	});
	}

	// Variables declaration - do not modify
	// End of variables declaration

}

وهذه النتيجة بعد عدة ضغطات بالفارة

run:

button 3

button 3

button 2

button 1

button 2

button 3

BUILD SUCCESSFUL (total time: 18 seconds)

لم الحظ ردك محمود كنت اكتب ردى فى نفس الوقت

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 6 مايو 2011 في 22:41

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#16

اهاا شكرا على الرد

لقد توقعت الاول والثاني ولكن الابتوب ليس عليه الثالث

مواضيع مشابهة