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

سؤال عن الرسم في جافا بدون فريم

بدأه AliveMyth في 4 فبراير 2009 · 15 رد · 2,545 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الأخوة الأفاضل في الفريق العربي للبرمجة

طلب منا مشروع رسم بالجافا في الجامعة

طبعا أنا لم أضع هذه المشاركة لأطلب مشروعا جاهزا

لأنني قد بدأت بتنفيذ لعبة الثعبان الشهيرة

لكن ما أريده هو أن يتحرك الثعبان في سطح المكتب بدون فريم

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

فأريد أن تكون اللعبة بنفس الفكرة

فهل من طريقة لعمل ذلك

ولو حتى رؤوس أقلام حتى أتمكن من البحث الموسع

طبعا للمثال أريد الآن رسم خط مستقيم فقط في سطح المكتب بدون فريم وليس لعبة كاملة

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

وجزاكم الله خيرا

#2

حقيقة أخي الكريم لا أدري إذا ما يوجد طريقة تستطيع القيام بذلك في لغة الجافا ام لا , لاني حاولت ان اعمل شيء مشابه تقريبا , وهو كيف اصنع برنامج بحيث يكون البرنامج حساس لحركة الماوس على سطح امكتب و ليس على الفريم , لكن لم أجد الجواب ... فقد قيل لي بأنه يجب ان تستخدم ما يسمى ب JNI و هي تكنولوجيا تسمح لك بتطوير البرامج بلغات اخرى مثل C++ وربطها مع لغو الجافا ,,

بمعنى اخر : ان لغة C++ قادرة على حل مشكلتي , لكن يجب ان أستخدم JNI لربط برنامجي المصمم على الجافا مع كود C++ لحل المشكلة.

اسف على الإطالة , و لا تأخذ كلامي على أنه مسلمات ..

انتظر رد الأعضاء , و أتمنى أن يفيدونا , أنا و انت , لاني محتاج ايضا لهكذا فكرة .

#3

شكرا أخي MKSoft على ردك وعلى المعلومة التي أضفتها

وما زلت بانتظار ردود الأعضاء

تحياتي

#4

ببساطة قم باخذ صورة سطح المكتب الي frame ومن ثم قم برسم اللعب على الصورة الماخوذة

#5

شكرا أخ superamh

لكن ليس هذا ما أريد

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

وكمثال كان لدي برنامج عباره عن طائر يتحرك في سطح المكتب وليس على صوره عن سطح المكتب

ومن ثم إذا أخذت صورة عن سطح المكتب لن تكون نفس سطح المكتب لدى جهاز آخر

على العموم تقبل تحياتي

#6

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

على حد علمي لا يوجد طريقة للرسم على المكتب في الجافا، ولكن ممكن ذلك عن طريق JNI كما قال الإخوة

اقتباس
ومن ثم إذا أخذت صورة عن سطح المكتب لن تكون نفس سطح المكتب لدى جهاز آخر

يعني تأخذ screenshot للمكتب بصورة دورية، في timer مثلا

هذا مثال يأخذ صورة للمكتب ويرسم فيها. هذا المثال ليس هو الحل لمشكلتك، ولكن فقط للإستئناس


import java.awt.event.*;
import javax.swing.*;

public class TestPaintDesktop extends JFrame implements ActionListener
{
int w, h;
int xShape = 50, yShape = 50;
Timer t;
TransparentBackground bg;

TestPaintDesktop()
{
w = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
h = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
t = new Timer(1000, this);
setBounds(0, 0, w, h);
setAlwaysOnTop(true);
setUndecorated(true);
bg = new TransparentBackground();
add(bg);
setVisible(true);
t.start();
}

public void actionPerformed(ActionEvent ae)
{
xShape += 10;
yShape += 10;
bg.updateBackground();
repaint();
}

public class TransparentBackground extends JComponent {
private JFrame frame;
private Image background;
private Dimension dim;

public TransparentBackground() {
updateBackground( );
}

public void updateBackground( ) {
try {
Robot rbt = new Robot( );
Toolkit tk = Toolkit.getDefaultToolkit( );
dim = tk.getScreenSize( );
background = rbt.createScreenCapture(
new Rectangle(0,0,(int)dim.getWidth( ),
(int)dim.getHeight( )));
} catch (Exception ex) {
ex.printStackTrace( );
}
}
public void paintComponent(Graphics g) {
background.getGraphics().fillOval(xShape, yShape, 30, 30);
g.drawImage(background, 0, 0, (int)dim.getWidth(), (int)dim.getHeight(), null);
}
}

public static void main(String args[])
{
new TestPaintDesktop();
}
}
import java.awt.*;

المثال مستلهم من كتاب swing hacks http://www.flazx.com/ebook3399.php

تم تعديل هذه المشاركة بواسطة herch في 5 فبراير 2009 في 15:01

#7

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

مثال على ذلك هناك برمجة صغيرة تأتي كدودة تأكل كل ما هو على سطح المكتب

بالطبع هذا مجرد مثال لتقريب الفركة ويمكنك الإعتماد على السورس كود لهذه البرامج لكن بالجافا المسألة صعبة قليلا

لكن البحث جاري عن الحل إن شاء الله

#8

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

أخي هل فكرت في إستخدام شكل الثعبان على frame و تغيير القيمة ل setLocation كما تحب (يعني تحطها rand تحطها في for loop أو كما تريد)

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#9

حقيقة يا إخواني ,, وكما أسلفت أن التعامل بشكل مباشر مع سطح المكتب , امر شبه مستحيل في الجافا .

لكن ان شاء الله نجد فكرة معينة تؤدي للحل.

#10
herch كتب:

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

على حد علمي لا يوجد طريقة للرسم على المكتب في الجافا، ولكن ممكن ذلك عن طريق JNI كما قال الإخوة

يعني تأخذ screenshot للمكتب بصورة دورية، في timer مثلا

هذا مثال يأخذ صورة للمكتب ويرسم فيها. هذا المثال ليس هو الحل لمشكلتك، ولكن فقط للإستئناس

شكرا لك أخي على الإضافة التي قدمتها

تقبل تحياتي

bilal2005 كتب:
على ما أعتقد ان الاخ يريد الرسم مباشرة على سطح المكتب

مثال على ذلك هناك برمجة صغيرة تأتي كدودة تأكل كل ما هو على سطح المكتب

بالطبع هذا مجرد مثال لتقريب الفركة ويمكنك الإعتماد على السورس كود لهذه البرامج لكن بالجافا المسألة صعبة قليلا

لكن البحث جاري عن الحل إن شاء الله

هذا تماما ما أريده

تحياتي ومازال البحث جاريا

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

أخي هل فكرت في إستخدام شكل الثعبان على frame و تغيير القيمة ل setLocation كما تحب (يعني تحطها rand تحطها في for loop أو كما تريد)

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

لكني أحببت أن أضيف إضافة مميزة في المشروع وهي ما طلبته

على العموم تحياتي للجميع

ومازال البحث جاريا

وقد وضعت هذا السؤال اليوم في منتدى جافا الرسمي ورد علي أحد الأعضاء وقال أن هذا العمل قد في جافا لا يكون إلا بالإطار

لكنه يمكن جعل الفريم شفافا وهذا ما قد أقوم به

تحياتي للجميع

MKSoft كتب:
حقيقة يا إخواني ,, وكما أسلفت أن التعامل بشكل مباشر مع سطح المكتب , امر شبه مستحيل في الجافا .

لكن ان شاء الله نجد فكرة معينة تؤدي للحل.

حقيقة يبدو الأمر شبه مستحيل

ولكن مازال البحث جاريا

وربما استخدم الطريقة التي أشار علي بها أحد الأعضاء في منتدى جافا وهي جعل الفريم شفافاً

لكن طبعا لجعل الفريم شفاف يلزم وجود JDK 6u10

تحياتي

#11

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

اقتباس
وربما استخدم الطريقة التي أشار علي بها أحد الأعضاء في منتدى جافا وهي جعل الفريم شفافاً

لكن طبعا لجعل الفريم شفاف يلزم وجود JDK 6u10

لا أظن أن هذا هو الحل، فحين تجعل الفريم شفافة، فالفريم لن تظهر و بالتالي كل ما ترسمه فيها لن يظهر

أخي هذا مثال يؤكد ما قلته، يمكنك تغيير قيمة المتحولة transparency إلى 0 لتتأكد

بالنسبة للكود المسؤول عن الشفافية، فهو مأخود من موقع sun وهو كما أشرت يتطلب jdk6u10 فما فوق


import java.awt.event.*;
import javax.swing.*;
import java.lang.reflect.*;

public class TestTransparency extends JFrame implements ActionListener
{
int w, h;
int xShape = 50, yShape = 50;
Timer t;
float transparency = 0.5f;

TestTransparency()
{
w = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
h = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
t = new Timer(1000, this);
setBounds(0, 0, w, h);
setAlwaysOnTop(true);
setUndecorated(true);
try {
Class<?> awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities");
Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class);
mSetWindowOpacity.invoke(null, this, Float.valueOf(transparency));
} catch (Exception ex) {
ex.printStackTrace();
}
setVisible(true);
t.start();
}

public void actionPerformed(ActionEvent ae)
{
xShape += 10;
yShape += 10;
repaint();
}
public void paint(Graphics g)
{
super.paint(g);
g.fillOval(xShape, yShape, 20, 20);
}

public static void main(String args[])
{
new TestTransparency();
}
}
 import java.awt.*;

#12
اقتباس
لا أظن أن هذا هو الحل، فحين تجعل الفريم شفافة، فالفريم لن تظهر و بالتالي كل ما ترسمه فيها لن يظهر

لا أعتقد ذلك فالشفافية تطبق فقط على الفريم وليس على ما يرسم في الفريم

فمثلا عندما نرسم صورة في لفريم شفافة ونكتب فوق الصورة باللون الأوسود فإن الكتابة تظهر

كذلك بالنسبة للفريم الشفاف حيث سيطبق الشفافية فقط على الفريم وليس على محتوى الفريم

ولكن ندع للأخ AliveMyth أن يجرب الشفافية ويرد علينا

ولكن مع ذلك سؤاء نجح الامر أم لم ينجح فإن هذا ليس بالحل الجيد لأن الخط لن يخرج عن إطار الفريم الذي رسمته ولن يتحكم في سطح المكتب

#13

ربما جعل الفريم شفافا , تحل جزء من المشكلة في اعتقادي ,ولا تحلها بشكل كامل , وذلك لانك سوف تبقى تتعامل مع الفريم , وليس مع سطح المكتب.

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

#14
bilal2005 كتب:
لا أعتقد ذلك فالشفافية تطبق فقط على الفريم وليس على ما يرسم في الفريم

فمثلا عندما نرسم صورة في لفريم شفافة ونكتب فوق الصورة باللون الأوسود فإن الكتابة تظهر

كذلك بالنسبة للفريم الشفاف حيث سيطبق الشفافية فقط على الفريم وليس على محتوى الفريم

ولكن ندع للأخ AliveMyth أن يجرب الشفافية ويرد علينا

ولكن مع ذلك سؤاء نجح الامر أم لم ينجح فإن هذا ليس بالحل الجيد لأن الخط لن يخرج عن إطار الفريم الذي رسمته ولن يتحكم في سطح المكتب

طبعا أخي الكريم عند جعل الفريم شفاف كل العناصر فيه من رسومات وأزرار وكتابة تكون ظاهرة وإلا مالفائدة من جعله شفافا إذا كانت العناصر لن تظهر

MKSoft كتب:
ربما جعل الفريم شفافا , تحل جزء من المشكلة في اعتقادي ,ولا تحلها بشكل كامل , وذلك لانك سوف تبقى تتعامل مع الفريم , وليس مع سطح المكتب.

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

أخي الكريم

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

كل ما في الأمر عند جعل الفريم شفاف سيعطي جمالية بحيث يظهر سطح المكتب في الفريم

تحياتي

#15

أخي جرب javaFX وان شاء الله ستجد ماتريد

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

بالتوفيق

مدونتي

برمجة وما يتبعها

#16

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

إخوتي الكرام أنا لست خبير في البرمجة بلغة الجافا، لكن سبق و أن واجهتني نفس المشكلة تقريبا،

ذات مرة كنت أبحث عن برنامج يقوم بإظهار ساعة كبيرة على سطح المكتب بحيث لا يؤثر وجودها على إستعمال الماوس أو لوحة المفاتيح على ماهو خلف الساعة.

فنصحني بعض الإخوة بإستعمال ما يسمى بالـ API في لغة c++ و فعلا تم ذلك ، حيث قمت بالبحث فوجدت عدة كودات حول هذا الأخير و هي تستعمل خاصية الشفافية على النافذة التي تظهر الساعة .

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

و قد قمت بإرفاق هذ البرنامج في المرفقات لعلا أن تكون فيه إفادة.

ملاحظة : ملف التطبيق موجود في مجلد Release

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

osd.rar

تم تعديل هذه المشاركة بواسطة streamen21 في 14 فبراير 2009 في 23:46

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