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

الكتابة علة الخط بعد رسمه

بدأه sunn في 27 أبريل 2011 · 13 رد · 548 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

ارجو المساعدة في حل هذه المشكلة:

اذا قمت برسم خط باستخدام الجرافيك (g.drawLine)

يقوم المستخدم بادخال نص باستخدام ال joptionPane

وبعد الادخال يتم كتابة النص في منتصف الخط

فارجو المساعدة في الكود لاني حاولت وما زبط معي

#2

اعرض محاولاتك اخى الكريم

واحنا نوضح لك ليه لم يظبط معاك

بالتوفيق

Software Developer
Mahmoudkelany.com


 

#3

اعرض محاولاتك اخى الكريم

واحنا نوضح لك ليه لم يظبط معاك

بالتوفيق

+

1

#4

المشكلة انه برنامجي طويل شوي وصعب شرحه فقلت تساعدوني في الكود وانا اعدل فيه بما يتناسب مع برنامجي

المشكلة عندي ليس في انه لا يكتب ولكن المشكلة في موقع الكتابة بحيث اريد ان تكون الكتابة فوق الخط او بجانبه مهما كان اتجاه الخط الذي يرسمه المستخدم (افقي عمودي او مائل)

تم تعديل هذه المشاركة بواسطة sunn في 29 أبريل 2011 في 12:23

#5

وهاي جزء من البرنامج لو نفذتوه تلاحظوا انه يكتب في اخر الخط انا اريد ان يكتب في وسط الخط مهما كان اتجاه الخط (يعني المشكلة في تحديد الاحداثيات x,y )

فارجو المساعدة

/**
 * @(#)DrawLine.java
 *
 *
 * @author 
 * @version 1.00 2011/4/29
 */
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;

public class DrawLine extends JPanel{
int x;int y;int z=-1;int xstart;int ystart;String length="";
    public DrawLine() {
    	addMouseMotionListener(new MouseAdapter(){
    	public void mouseDragged(MouseEvent e){
    	x=e.getX();
    	y=e.getY();
    	if(z==-1){
    		xstart=x;
    		ystart=y;
    		z++;
    	}
    	repaint();	
    	}	
    	});
    	addMouseListener(new MouseAdapter(){
    		public void mouseReleased(MouseEvent e){
    		length=JOptionPane.showInputDialog("Enter the length of the line");	
    			repaint();
    		}

    	});

    }
    public void paintComponent(Graphics g){
    	super.paintComponent(g);
    	g.drawLine(xstart,ystart,x,y);
    	g.drawString(length,x,y;
    }
  public static void main (String[] args) {
  	DrawLine panel=new DrawLine();
  	JFrame frame=new JFrame();
  	frame.add(panel);
  	frame.setVisible(true);
  	frame.setSize(400,400);
  	frame.setLocationRelativeTo(null);
  	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}  

}
#6

ما في احد يعرف الجواب؟؟؟؟؟؟؟؟

−1
#7
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawLine(xstart, ystart, x, y);
		int xString = xstart + (x - xstart) / 2;
		int yString = ystart + (y - ystart) / 2;
		g.drawString(length, xString, yString);
	}

تم تعديل هذه المشاركة بواسطة herch في 30 أبريل 2011 في 12:17

#8

مشكور جدا اخي زبط اخيرا وجزاك الله كل خير

بس شي تاني لو بدي ارسم مجموعة خطوط يعني مش بس خط واحد كيف اعملها

1
#9

يمكنك مثلا تخزين كل سطر على شكل كائن Line2D داخل ArrayList، ثم تعمل loop وترسم السطور الموجودة في ال ArrayList

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DrawLine extends JPanel {

	int x, y, z = -1, xstart, ystart;
	String length = "";
	ArrayList<Line2D> lines = new ArrayList<Line2D>();
	Line2D tempLine = new Line2D.Float();


	public DrawLine() {
		addMouseMotionListener(new MouseAdapter() {

			@Override
			public void mouseDragged(MouseEvent e) {
				x = e.getX();
				y = e.getY();
				if (z == -1) {
					xstart = x;
					ystart = y;
					z++;
				}
				tempLine.setLine(xstart, ystart, x, y);
				repaint();
			}
		});
		addMouseListener(new MouseAdapter() {

			@Override
			public void mouseReleased(MouseEvent e) {
				length = JOptionPane.showInputDialog("Enter the length of the line");
				lines.add(new Line2D.Float(tempLine.getP1(), tempLine.getP2()));
				repaint();
				tempLine.setLine(0, 0, 0, 0);
				z = -1;
			}
		});

	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		for (Line2D l : lines) {
			g2.draw(l);
		}
		g2.draw(tempLine);
		int xString = xstart + (x - xstart) / 2;
		int yString = ystart + (y - ystart) / 2;
		g.drawString(length, xString, yString);
	}

	public static void main(String[] args) {
		DrawLine panel = new DrawLine();
		JFrame frame = new JFrame();
		frame.add(panel);
		frame.setSize(400, 400);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
2
#10

يا اخي اولا مشكور على ردودك

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

#11

فقط استعمل ArrayList آخر يحتوي على طول كل خط

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DrawLine extends JPanel {

	int x, y, z = -1, xstart, ystart;
	ArrayList<Line2D> lines = new ArrayList<Line2D>();
	ArrayList<String> linesLength = new ArrayList<String>();
	Line2D tempLine = new Line2D.Float();


	public DrawLine() {
		addMouseMotionListener(new MouseAdapter() {

			@Override
			public void mouseDragged(MouseEvent e) {
				x = e.getX();
				y = e.getY();
				if (z == -1) {
					xstart = x;
					ystart = y;
					z++;
				}
				tempLine.setLine(xstart, ystart, x, y);
				repaint();
			}
		});
		addMouseListener(new MouseAdapter() {

			@Override
			public void mouseReleased(MouseEvent e) {
				String length = JOptionPane.showInputDialog("Enter the length of the line");
				linesLength.add(length);
				lines.add(new Line2D.Float(tempLine.getP1(), tempLine.getP2()));
				repaint();
				tempLine.setLine(0, 0, 0, 0);
				z = -1;
			}
		});

	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		for (int i = 0; i < lines.size(); i++) {
			Line2D l = lines.get(i);
			g2.draw(l);
			int xString = (int)l.getX1() + ((int)l.getX2() - (int)l.getX1()) / 2;
			int yString = (int)l.getY1() + ((int)l.getY2() - (int)l.getY1()) / 2;
			g.drawString(linesLength.get(i), xString, yString);
		}
		g2.draw(tempLine);
	}

	public static void main(String[] args) {
		DrawLine panel = new DrawLine();
		JFrame frame = new JFrame();
		frame.add(panel);
		frame.setSize(400, 400);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
#12

مشكور اخي وجزاك الله كل خير ولكن هل يمكن ان نعمل listener لكائنات graphic2D

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

انه بعد ان يقوم المستخد برسم شكل معين وادخال الاطوال وبعد الضغط على زر معين يتم تخزين الاطوال في مصفوفة ثنائية الابعاد(كيف يمككني عمل مصفوفة ثنائية الابعاد من نوع arrayList ؟) بحيث انه اذا تم رسم خط بين نقطتين يخزن في المصفوفة طول الخط (length) واذا لم يتم رسم خط يخزن في المصفوفة اي رمز (؟ مثلا )

#13

لم أفهم

#14

سأحاول التوضيح قدر الامكان

البرنامج وظيفته ان يقوم المستخدم برسم نقاط بالنقر على الماوس

ثم رسم خطوط بين هذه النقاط حسب رغبة المستخدم وادخال الطول (الجزء الذي انت حليته)

وعند النقر على زر (button ) يتم تخزين معلومات الرسمة على شكل مصفوفة ثنائية الابعاد عدد الصفوف والاعمدة فيها تساوي عدد النقاط

والمعلومات المخزنة في المصفوفة تكون على الشكل التالي

القطر تلقائيا يعبئ بالعدد ( 0 )

واذا كان بين النقطتين خط يتم تعبئة الخانة بطول الخط (المدخل من قبل المستخدم )

واذا لم يوجد خط يتم تعبئة الخانة بأي رمز (مثلا "؟" )

لا ادري ان فهمتني او لا فاذا لم تفهمني ارجو فقط اخباري بطريقة عمل مصفوفة ثنائية الابعاد من نوع ( arrayList ) واذا كان بالامكان عمل listener لكائنات graphic2D

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