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

مشكلة فى عرض دائرة

بدأه mr.beshoy في 3 أبريل 2010 · 7 رد · 543 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا قمت برسم شبكة 7 أعمدة * 6 صفوف . وأريد رسم دائرة فوق الشبكة - كنت قديماً كتبت مثال بسيط لهذه القضية و لكن اليوم كتبته بطريقة أخرى - و قمت بكتابة الجزء الخاص برسمها و لكنها لم تظهر ما السبب ؟؟

انظر للكود :

--------------------

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class TestNet extends JFrame {

    private DrawingNet drawingNet;

    public TestNet() {
        drawingNet = new DrawingNet();
        getContentPane().add(drawingNet, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        TestNet testNet = new TestNet();
        testNet.setDefaultCloseOperation(TestNet.EXIT_ON_CLOSE);
        testNet.setSize(new Dimension(600, 300));
        testNet.setLocationRelativeTo(null);
        testNet.setVisible(true);
        testNet.setExtendedState(MAXIMIZED_BOTH);
    }
}
-----------------------------------------------------------------
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

class DrawingNet extends JPanel {

    private static final int ROW = 6, COL = 7;
    private int X_START, Y_START, DISTANCE_Y, DISTANCE_X;
    private int x_OVAL = 348, y_OVAL = 17, OVAL_Width = 83, OVAL_HEIGHT = 83;

    public DrawingNet() {
        MyOval myOval = new MyOval();
        myOval.setOval_X(x_OVAL);
        myOval.setOval_Y(y_OVAL);
        myOval.setOVAL_WIDTH(OVAL_Width);
        myOval.setOVAL_HEIGHT(OVAL_HEIGHT);
        add(myOval);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        drawingNet(g2d);
    }

    private void drawingNet(Graphics2D g2d) {
        X_START = 97;
        Y_START = 100;
        DISTANCE_Y = 0;
        DISTANCE_X = 0;
        g2d.setColor(Color.BLACK);
        for (int r = 0; r < ROW; r++) {
            g2d.drawLine(X_START, Y_START + DISTANCE_Y, X_START * COL, Y_START + DISTANCE_Y);
            DISTANCE_Y += 83;

        }
        for (int c = 0; c <= COL; c++) {
            g2d.drawLine(X_START + DISTANCE_X, Y_START, X_START + DISTANCE_X, (Y_START * ROW) - 83);
            DISTANCE_X += 83;
        }
    }
}

------------------------------------------------------------------------------------
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

class MyOval extends JPanel {

    private int oval_X, oval_Y;
    private int OVAL_WIDTH, OVAL_HEIGHT;

    public MyOval() {
    }

    public void setOVAL_HEIGHT(int OVAL_HEIGHT) {
        this.OVAL_HEIGHT = OVAL_HEIGHT;
    }

    public void setOVAL_WIDTH(int OVAL_WIDTH) {
        this.OVAL_WIDTH = OVAL_WIDTH;
    }

    public void setOval_X(int oval_X) {
        this.oval_X = oval_X;
    }

    public void setOval_Y(int oval_Y) {
        this.oval_Y = oval_Y;
    }

    public int getOVAL_HEIGHT() {
        return OVAL_HEIGHT;
    }

    public int getOVAL_WIDTH() {
        return OVAL_WIDTH;
    }

    public int getOval_X() {
        return oval_X;
    }

    public int getOval_Y() {
        return oval_Y;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLUE);
        g2d.fillOval(getOval_X(), getOval_Y(), getOVAL_WIDTH(), getOVAL_HEIGHT());
    }
}

شكراً مقدماً

net.rar

#2

عندما أضفت هذين السطرين إلى ال Constructor الموجود فى ال Class MyOval

    setBackground(Color.WHITE);
        setPreferredSize(new Dimension(800, 100));

ظهرت panel بيضاء عليها الدائرة الزرقاء

و لكن أان أريد أن تظهر الدائرة فقط فى قمة الشبكة فى المنتصف

#3
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Ellipse2D;
import java.awt.Graphics2D;

class MyOval extends Ellipse2D.Float {

	private Color clr;

	public MyOval(int x, int y, int width, int height, Color clr) {
		super(x, y, width, height);
		this.clr = clr;
	}

	public Color getColor() {
		return clr;
	}
}

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

class DrawingNet extends JPanel {

	private static final int ROW = 6, COL = 7;
	private int X_START = 97, Y_START = 100, DISTANCE_Y, DISTANCE_X;
	private int x_OVAL = 348, y_OVAL = 17, OVAL_Width = 83, OVAL_HEIGHT = 83;
	private MyOval myOval;

	public DrawingNet() {
		myOval = new MyOval(x_OVAL, y_OVAL, OVAL_Width, OVAL_HEIGHT, Color.BLUE);
	}

	@Override	
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		drawingNet(g2d);
		g2d.setColor(myOval.getColor());
		g2d.fill(myOval);
	}

	private void drawingNet(Graphics2D g2d) {
		DISTANCE_Y = 0;
		DISTANCE_X = 0;
		g2d.setColor(Color.BLACK);
		for (int r = 0; r < ROW; r++) {
			g2d.drawLine(X_START, Y_START + DISTANCE_Y, X_START * COL, Y_START + DISTANCE_Y);
			DISTANCE_Y += 83;
		}
		for (int c = 0; c <= COL; c++) {
			g2d.drawLine(X_START + DISTANCE_X, Y_START, X_START + DISTANCE_X, (Y_START * ROW) - 83);
			DISTANCE_X += 83;
		}
	}
}
#4

شكراً لردك المفيد ..

-------------------------

أنا استطعت رسم الدائرة و التحكم فى حركتها فى المسار الأفقى و لكن لم أقوم بإنشاء الفئة MyOval

و عندما حاولت تطبيق التحكم فى حركة الدائرة فى المسار الأفقى من داخل الفئة MyOVal وجدت صعوبات انى لا استيطيع عمل repatin () و paintComponent لإنها ترث Ellipsed2D.FLoat

فقررت أن عملية رسم الدائرة و التحكم فى مسارها الأفقى أن أقوم بعملها فى الفئة DrawingTest

هل كلامى صحيح ؟؟ أم هناك طريقة لعمل هذا داخل الفئة MYOVal ؟؟؟؟

انظروا الكود - و مرفق أيضاً -

--------------------------------------------

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class TestNet extends JFrame {

    private DrawingNet drawingNet;

    public TestNet() {
        drawingNet = new DrawingNet();
        getContentPane().add(drawingNet, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        TestNet testNet = new TestNet();
        testNet.setDefaultCloseOperation(TestNet.EXIT_ON_CLOSE);
        testNet.setSize(new Dimension(600, 300));
        testNet.setLocationRelativeTo(null);
        testNet.setVisible(true);
        testNet.setExtendedState(MAXIMIZED_BOTH);
    }
}
-------------------------------------------------------------------------------------------------------------
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;

class DrawingNet extends JPanel {

    private static final int ROW = 6, COL = 7;
    private int X_START = 97, Y_START = 100, DISTANCE_Y = 0, DISTANCE_X = 83;
    private int x_OVAL = 348, y_OVAL = 17, OVAL_Width = 83, OVAL_HEIGHT = 83;
    private MyMouse myMouse;
    private MyOval myOval;

    public DrawingNet() {
        myMouse = new MyMouse();
        addMouseListener(myMouse);
        addMouseMotionListener(myMouse);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        drawingNet(g2d);
        int xChange = x_OVAL, distanceX = 83, col = 7, xFirst = 97;
        if (xChange < X_START) {
            xChange = X_START;
        } else if (xChange > (distanceX * col) + xFirst) {
            xChange = (distanceX * col);
        }
        g2d.fillOval(xChange, y_OVAL, OVAL_Width, OVAL_HEIGHT);
    }

    private void drawingNet(Graphics2D g2d) {
        X_START = 97;
        Y_START = 100;
        DISTANCE_Y = 0;
        DISTANCE_X = 0;
        g2d.setColor(Color.BLACK);
        for (int r = 0; r < ROW; r++) {
            g2d.drawLine(X_START, Y_START + DISTANCE_Y, X_START * COL, Y_START + DISTANCE_Y);
            DISTANCE_Y += 83;

        }
        for (int c = 0; c <= COL; c++) {
            g2d.drawLine(X_START + DISTANCE_X, Y_START, X_START + DISTANCE_X, (Y_START * ROW) - 83);
            DISTANCE_X += 83;
        }
    }

    private class MyMouse extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            super.mousePressed(e);
            x_OVAL = e.getX();
            repaint();
        }
    }
}

صحيح أنا تحكمت فى حركة الدائرة فى أن لا تتجاوز حدود الشبكة و تمت بالفعل و لكن فى البداية عنما اضغط خارج الشبكة فى المسار الأفقى للدائرة بمسافة DisTance_X=83 تتحرك خارجها و لكن تنضبط بعد ذلك و لا تخرج خارج المسار ....لماذا ذلك؟؟!!!

net.rar

#5
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;

class DrawingNet extends JPanel implements MouseListener {

	private static final int ROW = 6, COL = 7;
	private int X_START = 97, Y_START = 100, DISTANCE_Y, DISTANCE_X;
	private int x_OVAL = 348, y_OVAL = 17, OVAL_Width = 83, OVAL_HEIGHT = 83;
	private MyOval myOval;

	public DrawingNet() {
		myOval = new MyOval(x_OVAL, y_OVAL, OVAL_Width, OVAL_HEIGHT, Color.BLUE);
		//add the mouse listener
		addMouseListener(this);
	}

	@Override	
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		drawingNet(g2d);
		g2d.setColor(myOval.getColor());
		g2d.fill(myOval);
	}

	private void drawingNet(Graphics2D g2d) {
		DISTANCE_Y = 0;
		DISTANCE_X = 0;
		g2d.setColor(Color.BLACK);
		for (int r = 0; r < ROW; r++) {
			g2d.drawLine(X_START, Y_START + DISTANCE_Y, X_START * COL, Y_START + DISTANCE_Y);
			DISTANCE_Y += 83;
		}
		for (int c = 0; c <= COL; c++) {
			g2d.drawLine(X_START + DISTANCE_X, Y_START, X_START + DISTANCE_X, (Y_START * ROW) - 83);
			DISTANCE_X += 83;
		}
	}

	public void mousePressed(MouseEvent me) {
		x_OVAL = me.getX();
		//change the location of the ellipse
		myOval.setFrame(x_OVAL, y_OVAL, OVAL_Width, OVAL_HEIGHT);
		repaint();
	}
	public void mouseReleased(MouseEvent me) {}
	public void mouseClicked(MouseEvent me) {}
	public void mouseEntered(MouseEvent me) {}
	public void mouseExited(MouseEvent me) {}
}
#6

أنت حضرتك لغيت خالص جزء التحكم فى مسار الدائرة الأفقى

  int xChange = x_OVAL, distanceX = 83, col = 7, xFirst = 97;
        if (xChange < X_START) {
            xChange = X_START;
        } else if (xChange > (distanceX * col) + xFirst) {
            xChange = (distanceX * col);
        }
        g2d.fillOval(xChange, y_OVAL, OVAL_Width, OVAL_HEIGHT);

لماذا؟؟؟

ياريت توضح شوية

شكراً

#7

أضفه.

استعملت الكود القديم ولم ألاحظه.

#8

أنا الى عاوز اعرفه هل ممكن إضاقة الجزئية الى كتبها دى فى الفئة MyOVal

و إيه لزوم ال setFrame () فى مشكلتنا الى بنحكى فيها ؟؟؟

شكراً لتعبك

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