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

سؤال في الثريد

مغلق
بدأه akram في 9 يوليو 2004 · 6 رد · 688 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هدا البرنامج عباره عن يطبيق بسيط للثريد بحيث انه بعد الضغط على الزر تنطلق كره في اطار المربع وعند الضغط مره اخرى تنظلق كره اخرى وهكدا...الا اني اردت ان اصنع مربع اخر اسفل الاول فقمت بعمل كلااس Ball_1 على غرار الكلااس Ball وقمت فقط بتغيير

احداثيات المربع الدي تتحرك بداخله الكرات بحيث يعمل بشكل موازي للاؤل وطبعا عمل الابجكت الدي يستدعي الفنكشن ()ball_1.start

لكن التغيير لم يحدث اي اثر على البرنامج....ياترى لمادا؟

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

public class Bouncer_1 extends Applet implements ActionListener {

    private Button start, stop;
    private Ball ball;
    private Ball_1 ball_1;

    public void init() {
        start = new Button("Start");
        add(start);
        start.addActionListener(this);
        stop = new Button("Stop");
        add(stop);
        stop.addActionListener(this);
        
    }

    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == start) {
            Graphics g = getGraphics();
            ball = new Ball(g);                      
            ball_1 = new Ball_1(g);
            ball_1.start();
            ball.start();
        }
        if (event.getSource() == stop)
            ball.pleaseStop();
            ball_1.please_1Stop();
    }
}

class Ball extends Thread {
    public boolean keepGoing;
    private Graphics g;
    private int x = 7, xChange = 7;
    private int y =0, yChange = 2;
    private int diameter = 10;
    private int rectLeftX = 0, rectRightX = 100;
    private int rectTopY = 0, rectBottomY = 100;

    public Ball(Graphics graphics) {
        g = graphics;
        keepGoing = true;
    }

    public void pleaseStop() {
        keepGoing = false;
    }

    public void run() {
        g.drawRect(rectLeftX, rectTopY,
                   rectRightX - rectLeftX, rectBottomY - rectTopY);

        while (keepGoing) {
          g.setColor(Color.white);
            g.fillOval (x, y, diameter, diameter);

            if (x + xChange <= rectLeftX) 
                xChange = -xChange;
            if (x + xChange >= rectRightX)
                xChange = -xChange;

            if (y + yChange <= rectTopY)
                yChange = -yChange;
            if (y + yChange >= rectBottomY)
                yChange = -yChange;

            x = x + xChange;
            y = y + yChange;

            g.setColor(Color.red);  
            g.fillOval (x, y, diameter, diameter);

            try {
                Thread.sleep(50);
            }
            catch (InterruptedException e) {
                System.err.println("sleep exception");

            }
        }
    }
}


class Ball_1 extends Thread {
    private boolean keepGoing;
    private Graphics g;
    private int x2 = 7, xChange2 = 7;
    private int y2 = 0, yChange2 = 2;
    private int diameter2 = 10;
    private int rectLeftX2 = 0, rectRightX2 = 100;
    private int rectTopY2 =120, rectBottomY2 = 100;

    public Ball_1(Graphics graphics) {
        g = graphics;
        keepGoing = true;
         
    }

    public void please_1Stop() {
        keepGoing = false;
    }

    public void run() {
         g.drawRect(rectLeftX2, rectTopY2,
                   rectRightX2 - rectLeftX2, rectBottomY2 - rectTopY2);

        while (keepGoing) {
         g.setColor(Color.white);
            g.fillOval (x2, y2, diameter2, diameter2);

            if (x2 + xChange2 <= rectLeftX2) 
                xChange2 = -xChange2;
            if (x2 + xChange2 >= rectRightX2)
                xChange2 = -xChange2;

            if (y2 + yChange2 <= rectTopY2)
                yChange2 = -yChange2;
            if (y2 + yChange2 >= rectBottomY2)
                yChange2 = -yChange2;

            x2 = x2 + xChange2;
            y2 = y2 + yChange2;

            g.setColor(Color.red);  
            g.fillOval (x2, y2, diameter2, diameter2);

            try {
                Thread.sleep(50);
               
            }
            catch (InterruptedException e) {
                System.err.println("sleep exception");

            }
        }
    }
}




اقتباس

زورو موقعنا

www.algabal.com

#2

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

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

 private int rectLeftX2 = 0, rectRightX2 = 100;
   private int rectTopY2 =120, rectBottomY2 = 100;

 g.drawRect(rectLeftX2, rectTopY2,  rectRightX2 - rectLeftX2, rectBottomY2 - rectTopY2);

  if (x + xChange <= rectLeftX) 
               xChange = -xChange;
           if (x + xChange >= rectRightX)
               xChange = -xChange;

           if (y + yChange <= rectTopY)
               yChange = -yChange;
           if (y + yChange >= rectBottomY)
               yChange = -yChange;

           x = x + xChange;
           y = y + yChange;

لست متواجد بشكل يومي

#3

الاخ Student_1981 لقد غيرت الكود للافضل الا انه لم تتحرك الكره واحيانا لاتظهر اصلا

هل بضنك ان هدا له علاقه بلثريد ؟

ثم ما علاقه الكود:

اقتباس
if (x + xChange <= rectLeftX)

              xChange = -xChange;

          if (x + xChange >= rectRightX)

              xChange = -xChange;

          if (y + yChange <= rectTopY)

              yChange = -yChange;

          if (y + yChange >= rectBottomY)

              yChange = -yChange;

          x = x + xChange;

          y = y + yChange;

فهدا الجزء ثابت لانه تم تعريفه في بدايه الكلاس!

الكود بعد التغيير:

/**
 * @(#)Bouncer_2.java
 *
 * Sample Applet application
 *
 * @author 
 * @version 1.00 04/07/10
 */
 import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

public class Bouncer_2 extends Applet implements ActionListener {

   private Button start, stop;
   private Ball ball;
   private Ball_1 ball_1;

   public void init() {
       start = new Button("Start");
       add(start);
       start.addActionListener(this);
       stop = new Button("Stop");
       add(stop);
       stop.addActionListener(this);
       
   }

   public void actionPerformed(ActionEvent event) {
       if (event.getSource() == start) {
           Graphics g = getGraphics();
           ball = new Ball(g);                      
           ball_1 = new Ball_1(g);
           ball_1.start();
           ball.start();
       }
       if (event.getSource() == stop)
           ball.pleaseStop();
           ball_1.please_1Stop();
   }
}

class Ball extends Thread {
   public boolean keepGoing;
   private Graphics g;
   private int x = 7, xChange = 7;
   private int y =0, yChange = 2;
   private int diameter = 10;
   private int rectLeftX = 0, rectRightX = 100;
   private int rectTopY = 0, rectBottomY = 100;
   public Ball(Graphics graphics) {
       g = graphics;
       keepGoing = true;
   }
  public void pleaseStop() {
       keepGoing = false;
   }
   public void run() {
       g.drawRect(rectLeftX, rectTopY,
                  rectRightX - rectLeftX, rectBottomY - rectTopY);
       while (keepGoing) {
         g.setColor(Color.white);
           g.fillOval (x, y, diameter, diameter);

           if (x + xChange <= rectLeftX) 
               xChange = -xChange;
           if (x + xChange >= rectRightX)
               xChange = -xChange;

           if (y + yChange <= rectTopY)
               yChange = -yChange;
           if (y + yChange >= rectBottomY)
               yChange = -yChange;

           x = x + xChange;
           y = y + yChange;

           g.setColor(Color.red);  
           g.fillOval (x, y, diameter, diameter);

           try {
               Thread.sleep(50);
           }
           catch (InterruptedException e) {
               System.err.println("sleep exception");

           }
       }
   }
}


class Ball_1 extends Thread {
   private boolean keepGoing1;
   private Graphics g;
   private int x2 = 7, xChange2 = 7;
   private int y2 = 150, yChange2 = 2;
   private int diameter2 = 10;
   private int rectLeftX2 = 0, rectRightX2 = 100;
   private int rectTopY2 =130, rectBottomY2 = 220;

   public Ball_1(Graphics graphics) {
       g = graphics;
       keepGoing1 = true;    
   }
   public void please_1Stop() {
       keepGoing1 = false;
   }
   public void run() {
         g.drawRect(rectLeftX2, rectTopY2,
                  rectRightX2 - rectLeftX2, rectBottomY2 - rectTopY2);
       while (keepGoing1) {
        g.setColor(Color.white);
           g.fillOval (x2, y2, diameter2, diameter2);

           if (x2 + xChange2 <= rectLeftX2) 
               xChange2 = -xChange2;
           if (x2 + xChange2 >= rectRightX2)
               xChange2 = -xChange2;

           if (y2 + yChange2 <= rectTopY2)
               yChange2 = -yChange2;
           if (y2 + yChange2 >= rectBottomY2)
               yChange2 = -yChange2;

           x2 = x2 + xChange2;
           y2 = y2 + yChange2;

           g.setColor(Color.red);  
           g.fillOval (x2, y2, diameter2, diameter2);

           try {
               Thread.sleep(50);
              
           }
           catch (InterruptedException e) {
               System.err.println("sleep exception");

           }
       }
   }
}

زورو موقعنا

www.algabal.com

#4

سلام عليكم....

الخطأ بسيط جدا

ولم ينتبه له أحد

أسمع غير التالي:

rectBottomY = 200

بدلا من 100

لكي يرسم المستطيل تحت المستطيل الاول

y = 100

لأننا عملنا SHIFT للمستطيل بـ 100 نقطة

والان الى الغلطة المهمة

أخبرني مالفرق بين

       if (event.getSource() == stop)
        ball.pleaseStop();
           ball_1.please_1Stop();
      }

وهذا

       if (event.getSource() == stop){
        ball.pleaseStop();
           ball_1.please_1Stop();
       }

هل عرفت الان لماذا لا يتحرك شيء؟؟؟

اذا احتجت شيء آخر أخبرني

سلام...

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#5

الحق الاخ MEMONONO لم افهم لمادا غياب القوس بعد الشرط

{( if (event.getSource() == stop)

يؤدي الى كل هدا؟؟؟؟؟؟؟؟؟؟

زورو موقعنا

www.algabal.com

#6

مشكور اخ MEMONONO على الملاحظة الدقيقة التي لم انتبه اليها

لست متواجد بشكل يومي

#7

حسب الكود التالي

    if (event.getSource() == stop)
       ball.pleaseStop();
          ball_1.please_1Stop();
     }

هذا الكود سيفهمه ال Compiler كالتالي

if (event.getSource() == stop)
           ball.pleaseStop();
          else
          ball_1.please_1Stop();
      

   }

اتمنى انك فهمت اخ اكرم الفرق

لذلك هذا هو الصحيح

 if (event.getSource() == stop){
       ball.pleaseStop();
          ball_1.please_1Stop();
      }

لست متواجد بشكل يومي

هذا الموضوع مغلق.

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