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

مشكلة فى ال Jpopupmenu?

بدأه mr.beshoy في 6 أكتوبر 2008 · 9 رد · 930 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام للجميع

انا الكود ده

عامل فى BufferedImage

و عامل popupmenu

فيها 3 buttons (line,oval,rect)

الهدف منها أنى لما اضغط على اى زر ارسم الشكل الى عاوزه

المشكلة بقى فى ان الpopupmenue

مش عاوزة تظهر ليش

ياريت تفيدونى

و أدى الكود بتاعى أهو

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class PopMenuDemo extends JFrame {

	private BufferedImage image;
	private Graphics g;
	private PopMenueTestDemo popmenuetestdemo = new PopMenueTestDemo();
	public PopMenuDemo() {

		image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
		g = image.getGraphics();
		g.fillRect(0, 0, 1000, 1000);
		g.setColor(Color.WHITE);


		  getContentPane().add(new PopMenueTestDemo());
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(image, 0, 0, null);
	}

	public static void main(String[] args) {
		JFrame frame = new PopMenuDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setSize(300, 200);
		frame.setVisible(true);
	}
}

و أدى الكلاس PopMenueTestDemo

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class PopMenueTestDemo extends JPanel {
	private JPopupMenu popupmenu;
	private String[]shape={"line","oval","rect"};
	private JButton []button_shape;

	public PopMenueTestDemo(){
		popupmenu=new JPopupMenu();

		button_shape=new JButton[shape.length];
		for(int i=0;i<shape.length;++i){
			button_shape=new JButton(shape);
			popupmenu.add(button_shape);
		}
	 }
}
#2

الـ Popup لا يظهر بسبب أنه لا يوجد هناك MouseListener حتى يقوم بالتعامل مع الحدث الخاص بالضغط على الزر الأيمن ...

أدخل الكود التالي في داله البناء في الملف PopMenueTestDemo :

 

[color= #000000; font-weight: bold;]this.[color= #006633;]addMouseListener[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]MouseAdapter[color= #009900;]([color= #009900;]) 

[color= #009900;]{

[color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void mouseReleased[color= #009900;]([color= #003399;]MouseEvent e[color= #009900;]) [color= #009900;]{

[color= #000000; font-weight: bold;]if [color= #009900;](e.[color= #006633;]isPopupTrigger[color= #009900;]([color= #009900;])[color= #009900;])

 [color= #009900;]{

popupmenu.[color= #006633;]show[color= #009900;]( e.[color= #006633;]getComponent[color= #009900;]([color= #009900;]), e.[color= #006633;]getX[color= #009900;]([color= #009900;]), e.[color= #006633;]getY[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

[color= #009900;]}

[color= #009900;]}

[color= #009900;]}

[color= #009900;])[color= #339933;];

وأضف :

import java.awt.event.MouseAdapter ;

import java.awt.event.MouseEvent ;

وسيظهر الأن الJPopupMenu ..

لكن ما الفائده من PopMenueTestDemo ؟ يمكن أن تضع الكود الذي بداخله داخل ملف PopMenuDemo ويكون هذا الكلاس خاص بالevent ..

أنظر لهذا المثال :

Creating popup menus with Swing

هنا الكلاس فقط سوف يقوم بالتعامل مع الحدث ... أما أنشاء القائمه والأزرار بداخلها سوف تكون من مهمه الكلاس الرئيسي ...

 

 [color= #000000; font-weight: bold;]class PopupListener [color= #000000; font-weight: bold;]extends [color= #003399;]MouseAdapter [color= #009900;]{

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void mousePressed[color= #009900;]([color= #003399;]MouseEvent e[color= #009900;]) [color= #009900;]{

      maybeShowPopup[color= #009900;](e[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void mouseReleased[color= #009900;]([color= #003399;]MouseEvent e[color= #009900;]) [color= #009900;]{

      maybeShowPopup[color= #009900;](e[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]private [color= #000066; font-weight: bold;]void maybeShowPopup[color= #009900;]([color= #003399;]MouseEvent e[color= #009900;]) [color= #009900;]{

      [color= #000000; font-weight: bold;]if [color= #009900;](e.[color= #006633;]isPopupTrigger[color= #009900;]([color= #009900;])[color= #009900;])

        popup.[color= #006633;]show[color= #009900;]([color= #009900;]([color= #009900;]([color= #003399;]JApplet[color= #009900;]) e.[color= #006633;]getComponent[color= #009900;]([color= #009900;])[color= #009900;]).[color= #006633;]getContentPane[color= #009900;]([color= #009900;]), e

            .[color= #006633;]getX[color= #009900;]([color= #009900;]), e.[color= #006633;]getY[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

    [color= #009900;]}

  [color= #009900;]}

الموضوع فقط لزياده مقروئيه الكود ، فقط لا أكثر ... أنظر لبقيه الأمثله في الرابط السابق للأستفاده .

بالتوفيق ،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 6 أكتوبر 2008 في 14:01

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

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

و لكن هناك مشكلة أخرى هندما فعلت كما قولت

اقتباس
هنا الكلاس فقط سوف يقوم بالتعامل مع الحدث ... أما أنشاء القائمه والأزرار بداخلها سوف تكون من مهمه الكلاس الرئيسي ...

و هى :

أنى لا استطيع مناداة الpopmenudemo فى الكلاس popuplistener

 private void showPopup(MouseEvent e) {
		if(e.isPopupTrigger()){
		 // PopMenuDemo.show(e.geComponent(),e.getX(),e.getY());

		}

و هاك الكود كامل :

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;

public class PopMenuDemo extends JFrame {

	private BufferedImage image;
	private Graphics g;
	private JPopupMenu popupmenu;
	private String[] shape = {"line", "oval", "rect"};
	private JButton[] button_shape;
	private PopupListener popuplistener = new  PopupListener();
	public PopMenuDemo() {

		image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
		g = image.getGraphics();
		g.fillRect(0, 0, 1000, 1000);
		g.setColor(Color.WHITE);

		popupmenu = new JPopupMenu();

		button_shape = new JButton[shape.length];
		for (int i = 0; i < shape.length; ++i) {
			button_shape = new JButton(shape);
			popupmenu.add(button_shape);
		}

	   addMouseListener(popuplistener);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(image, 0, 0, null);
	}

	public static void main(String[] args) {
		JFrame frame = new PopMenuDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setSize(300, 200);
		frame.setVisible(true);
	}
}

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PopupListener extends MouseAdapter {
	@Override
	public void mousePressed(MouseEvent e){
		showPopup(e);
	}
	public void mouseRelesed(MouseEvent e){
		showPopup(e);
	}

	private void showPopup(MouseEvent e) {
		if(e.isPopupTrigger()){
		 // PopMenuDemo.show(e.geComponent(),e.getX(),e.getY());

		}
	}
}
#4

سبب رساله الخطأ لديك هو أن الكائن PopMenuDemo غير معرف بالأضافه الى أنك نسيت الحرف t في الداله getComponent() .. ولديك حلين ، الأول وهو الأسهل وهو أن تقوم بكتابه الكلاسين في ملف واحد ، بحيث يكون الكلاس الرئيسي هو PopMenuDemo ويحتوي على كلاس داخلي inner class يتعامل مع الحدث وهو PopupListener .

الحل الثاني ، وهو عندما تنشىء كائن الـPopupListener مرر له كائن من Popup ، وفي داله البناء في الـPopupListener استقبل الكائن وخزنه لديك مثلا في p .

الأن في الداله showPopup الموجوده في الـPopupListener ، أكتب :

 

[color= #000000; font-weight: bold;]private [color= #000066; font-weight: bold;]void showPopup[color= #009900;]([color= #003399;]MouseEvent e[color= #009900;]) [color= #009900;]{

   [color= #000000; font-weight: bold;]if[color= #009900;](e.[color= #006633;]isPopupTrigger[color= #009900;]([color= #009900;])[color= #009900;])

   p.[color= #006633;]show[color= #009900;](e.[color= #006633;]getComponent[color= #009900;]([color= #009900;]),e.[color= #006633;]getX[color= #009900;]([color= #009900;]),e.[color= #006633;]getY[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

 [color= #009900;]}

على العموم ، الحلين بعد تعديلهم لم يعملوا لدى ولا أدري ما السبب :blink: !! وبعد قليل من البحث تبين أن هناك مشاكل مع الداله isPopupTrigger حيث أنها بعض الأحيان ترجع false ومره true على حسب نظام التشغيل وحسب Look&Feel وحسب مزاجها :P

لذلك هناك حل أخر ، اذا لم تعمل معك ، وهو أن نتعامل مع mousePressed وفي داخل الداله نختبر هل الزر هو الزر الأيمن META_MASK ، فاذا كان كذلك فنقوم باظهار الPopup .

 

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.Color[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.Graphics[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.image.BufferedImage[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.event.MouseAdapter[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.event.MouseEvent[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JButton[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JFrame[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JPopupMenu[color= #339933;];

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class PopMenuDemo [color= #000000; font-weight: bold;]extends [color= #003399;]JFrame [color= #009900;]{

 

    [color= #000000; font-weight: bold;]private [color= #003399;]BufferedImage image[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]Graphics g[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]JPopupMenu popupmenu[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]String[color= #009900;][[color= #009900;]] shape [color= #339933;]= [color= #009900;]{[color= #0000ff;]"line", [color= #0000ff;]"oval", [color= #0000ff;]"rect"[color= #009900;]}[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]JButton[color= #009900;][[color= #009900;]] button_shape[color= #339933;];

 

 

    [color= #000000; font-weight: bold;]public PopMenuDemo[color= #009900;]([color= #009900;]) [color= #009900;]{

 

        image [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]BufferedImage[color= #009900;]([color= #cc66cc;]1000, [color= #cc66cc;]1000, [color= #003399;]BufferedImage.[color= #006633;]TYPE_INT_RGB[color= #009900;])[color= #339933;];

        g [color= #339933;]= image.[color= #006633;]getGraphics[color= #009900;]([color= #009900;])[color= #339933;];

        g.[color= #006633;]fillRect[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]0, [color= #cc66cc;]1000, [color= #cc66cc;]1000[color= #009900;])[color= #339933;];

        g.[color= #006633;]setColor[color= #009900;]([color= #003399;]Color.[color= #006633;]WHITE[color= #009900;])[color= #339933;];

 

        popupmenu [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JPopupMenu[color= #009900;]([color= #009900;])[color= #339933;];

 

        button_shape [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JButton[color= #009900;][shape.[color= #006633;]length[color= #009900;]][color= #339933;];

        [color= #000000; font-weight: bold;]for [color= #009900;]([color= #000066; font-weight: bold;]int i [color= #339933;]= [color= #cc66cc;]0[color= #339933;]; i [color= #339933;]< shape.[color= #006633;]length[color= #339933;]; [color= #339933;]++i[color= #009900;]) [color= #009900;]{

            button_shape[color= #009900;][i[color= #009900;]] [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JButton[color= #009900;](shape[color= #009900;][i[color= #009900;]][color= #009900;])[color= #339933;];

            popupmenu.[color= #006633;]add[color= #009900;](button_shape[color= #009900;][i[color= #009900;]][color= #009900;])[color= #339933;];

        [color= #009900;]}

 

       addMouseListener[color= #009900;]([color= #000000; font-weight: bold;]new  PopupListener[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

 

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void paint[color= #009900;]([color= #003399;]Graphics g[color= #009900;]) [color= #009900;]{

        [color= #000000; font-weight: bold;]super.[color= #006633;]paint[color= #009900;](g[color= #009900;])[color= #339933;];

        g.[color= #006633;]drawImage[color= #009900;](image, [color= #cc66cc;]0, [color= #cc66cc;]0, [color= #000066; font-weight: bold;]null[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void main[color= #009900;]([color= #003399;]String[color= #009900;][[color= #009900;]] args[color= #009900;]) [color= #009900;]{

        [color= #003399;]JFrame frame [color= #339933;]= [color= #000000; font-weight: bold;]new PopMenuDemo[color= #009900;]([color= #009900;])[color= #339933;];

        frame.[color= #006633;]setDefaultCloseOperation[color= #009900;]([color= #003399;]JFrame.[color= #006633;]EXIT_ON_CLOSE[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setLocationRelativeTo[color= #009900;]([color= #000066; font-weight: bold;]null[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setSize[color= #009900;]([color= #cc66cc;]300, [color= #cc66cc;]200[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setVisible[color= #009900;]([color= #000066; font-weight: bold;]true[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

[color= #000000; font-weight: bold;]private [color= #000000; font-weight: bold;]class PopupListener [color= #000000; font-weight: bold;]extends [color= #003399;]MouseAdapter 

[color= #009900;]{

	[color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void mousePressed[color= #009900;]([color= #003399;]MouseEvent me[color= #009900;])

	[color= #009900;]{

		[color= #000066; font-weight: bold;]int [color= #003399;]Key [color= #339933;]= me.[color= #006633;]getModifiers[color= #009900;]([color= #009900;]) [color= #339933;];

 

	[color= #000000; font-weight: bold;]if [color= #009900;]([color= #003399;]Key [color= #339933;]== me.[color= #006633;]META_MASK[color= #009900;])

	popupmenu.[color= #006633;]show[color= #009900;](me.[color= #006633;]getComponent[color= #009900;]([color= #009900;]),me.[color= #006633;]getX[color= #009900;]([color= #009900;]),me.[color= #006633;]getY[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

	[color= #009900;]}

[color= #009900;]}

 

[color= #009900;]}

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5
الحل الثاني ، وهو عندما تنشىء كائن الـPopupListener مرر له كائن من Popup ، وفي داله البناء في الـPopupListener استقبل الكائن وخزنه لديك مثلا في p .

الصراحة مش عارف اعملها ياريت توضحها

و لكن أنا جربت

الأ أن تقوم بكتابه الكلاسين في ملف واحد ، بحيث يكون الكلاس الرئيسي هو PopMenuDemo ويحتوي على كلاس داخلي inner Class يتعامل مع الحدث وهو PopupListener .

و نفعت لكن انا مش عاوز فى ملف واحد

ياريت توضحها شوية معلش

شكرا

#6

خلاص ياباشا

عرفت اوصلها بس ياريت بردو تدينى تعليقك لو عندك طريقة أفضل

انا مكنتش عارف انادى فى الكلاس poplistener على ال popupmenu

الى هى object من Jpopupmenu

فجعلت فى الكلاس popmenudemo

 public static JPopupMenu popupmenu;

بدل ما كانت private

و بكده عرفت اناديها فى الكلاس التانى

 PopMenuDemo.popupmenu.show(e.getComponent(),e.getX(),e.getY());

بس لو عندك طريقة تانى قول

شكرا

#7

أهلا أخي الكريم ،،

هناك مفهوم عام في البرمجه بالكائنات OO وهو توفير حمايه لجميع المتغيرات داخل الكلاس .. حتى لا يقوم كلاس أخر بعمل كائن من هذا الكلاس والوصول للمتغير العام وبالتالي يغير فيه ، وهكذا يكون كلاسك غير أمن بشكل جيد .. فيجب عليك توفير الحمايه لهذه المتغيرات أو الكائنات كما في JPopupMenu وتكون private .

بالتالى فإن محاولاتك الأخيره صحيحه ، لكنها تصميم غير جيد ، وفي البرامج الصغيره لن يكون لهذا الكلام معنى (أقصد public ,private) لكن كلما كبر البرنامج كلما تظهر الفائده بشكل أكبر .. لذلك من الأن عليك أتباع العادات الجيده في البرمجه وجعل جميع المتغيرات لديك private وهكذا تكون طبقت مبدأ Encapsulation الكبسله .

لديك حلين لهذه المشكله ، كما وضحتهم في الرد الأول ، الأول هو جعل الكلاسين في ملف واحد وهو في هذه الحاله أفضل حل على الإطلاق ، لماذا؟ لأن الكلاس الثاني PopupListener ليست له أي وظيفه سوى أظهار Popup والتعامل مع الحدث الخاص بالكلاس الأول .. لذلك لن توجد فائده في فصل الكلاس الخاص بالحدث في ملف جديد ..و جافا وفرت لدينا خاصيه جميله في هذه الحالات وهي inner classes ، أي يكون الكلاس الخاص بالحدث داخل الكلاس الرئيسي ..

الحل الثاني ، وهو أرسال الكائن popup للكلاس الخاص بالحدث ، وبالتالي سوف أحصل على Rerfernce للكائن popup ، ومن خلال هذا الReference أستطيع استدعاء الداله show ، أنظر للمثال لكي يوضح لك أكثر :

PopupMenuDemo.java

 

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.Color[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.Graphics[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.image.BufferedImage[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.event.MouseAdapter[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JButton[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JFrame[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JPopupMenu[color= #339933;];

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class PopupMenuDemo [color= #000000; font-weight: bold;]extends [color= #003399;]JFrame [color= #009900;]{

 

    [color= #000000; font-weight: bold;]private [color= #003399;]BufferedImage image[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]Graphics g[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]JPopupMenu popupmenu[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]String[color= #009900;][[color= #009900;]] shape [color= #339933;]= [color= #009900;]{[color= #0000ff;]"line", [color= #0000ff;]"oval", [color= #0000ff;]"rect"[color= #009900;]}[color= #339933;];

    [color= #000000; font-weight: bold;]private [color= #003399;]JButton[color= #009900;][[color= #009900;]] button_shape[color= #339933;];

 

 

    [color= #000000; font-weight: bold;]public PopupMenuDemo[color= #009900;]([color= #009900;]) [color= #009900;]{

 

        image [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]BufferedImage

          [color= #009900;]([color= #cc66cc;]1000, [color= #cc66cc;]1000, [color= #003399;]BufferedImage.[color= #006633;]TYPE_INT_RGB[color= #009900;])[color= #339933;];

        g [color= #339933;]= image.[color= #006633;]getGraphics[color= #009900;]([color= #009900;])[color= #339933;];

        g.[color= #006633;]fillRect[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]0, [color= #cc66cc;]1000, [color= #cc66cc;]1000[color= #009900;])[color= #339933;];

        g.[color= #006633;]setColor[color= #009900;]([color= #003399;]Color.[color= #006633;]WHITE[color= #009900;])[color= #339933;];

 

        popupmenu [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JPopupMenu[color= #009900;]([color= #009900;])[color= #339933;];

 

        button_shape [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JButton[color= #009900;][shape.[color= #006633;]length[color= #009900;]][color= #339933;];

        [color= #000000; font-weight: bold;]for [color= #009900;]([color= #000066; font-weight: bold;]int i [color= #339933;]= [color= #cc66cc;]0[color= #339933;]; i [color= #339933;]< shape.[color= #006633;]length[color= #339933;]; [color= #339933;]++i[color= #009900;]) [color= #009900;]{

            button_shape[color= #009900;][i[color= #009900;]] [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JButton[color= #009900;](shape[color= #009900;][i[color= #009900;]][color= #009900;])[color= #339933;];

            popupmenu.[color= #006633;]add[color= #009900;](button_shape[color= #009900;][i[color= #009900;]][color= #009900;])[color= #339933;];

        [color= #009900;]}

 

      addMouseListener[color= #009900;]([color= #000000; font-weight: bold;]new  PopupListener[color= #009900;](popupmenu[color= #009900;])[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void paint[color= #009900;]([color= #003399;]Graphics g[color= #009900;]) [color= #009900;]{

        [color= #000000; font-weight: bold;]super.[color= #006633;]paint[color= #009900;](g[color= #009900;])[color= #339933;];

        g.[color= #006633;]drawImage[color= #009900;](image, [color= #cc66cc;]0, [color= #cc66cc;]0, [color= #000066; font-weight: bold;]null[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void main[color= #009900;]([color= #003399;]String[color= #009900;][[color= #009900;]] args[color= #009900;]) [color= #009900;]{

        [color= #003399;]JFrame frame [color= #339933;]= [color= #000000; font-weight: bold;]new PopupMenuDemo[color= #009900;]([color= #009900;])[color= #339933;];

        frame.[color= #006633;]setDefaultCloseOperation[color= #009900;]([color= #003399;]JFrame.[color= #006633;]EXIT_ON_CLOSE[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setLocationRelativeTo[color= #009900;]([color= #000066; font-weight: bold;]null[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setSize[color= #009900;]([color= #cc66cc;]300, [color= #cc66cc;]200[color= #009900;])[color= #339933;];

        frame.[color= #006633;]setVisible[color= #009900;]([color= #000066; font-weight: bold;]true[color= #009900;])[color= #339933;];

    [color= #009900;]}

 

[color= #009900;]}

PopupListener.java

 

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.event.MouseAdapter[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.awt.event.MouseEvent[color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.swing.JPopupMenu[color= #339933;];

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class PopupListener [color= #000000; font-weight: bold;]extends [color= #003399;]MouseAdapter 

[color= #009900;]{

	[color= #000000; font-weight: bold;]private [color= #003399;]JPopupMenu popupmenu [color= #339933;];

 

	[color= #000000; font-weight: bold;]public PopupListener [color= #009900;]([color= #003399;]JPopupMenu p[color= #009900;])

	[color= #009900;]{

		popupmenu[color= #339933;]= p [color= #339933;];

	[color= #009900;]}

 

	[color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void mousePressed[color= #009900;]([color= #003399;]MouseEvent me[color= #009900;])

	[color= #009900;]{

	[color= #000066; font-weight: bold;]int [color= #003399;]Key [color= #339933;]= me.[color= #006633;]getModifiers[color= #009900;]([color= #009900;]) [color= #339933;];

 

	[color= #000000; font-weight: bold;]if [color= #009900;]([color= #003399;]Key [color= #339933;]== me.[color= #006633;]META_MASK[color= #009900;])

	popupmenu.[color= #006633;]show[color= #009900;](me.[color= #006633;]getComponent[color= #009900;]([color= #009900;]),me.[color= #006633;]getX[color= #009900;]([color= #009900;]),me.[color= #006633;]getY[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];

	[color= #009900;]}

[color= #009900;]}

لو لاحظت أننا سنرسل الكائن popup للكلاس PopupListener في داله البناء ، ومن خلاله نستطيع استدعاء الداله بشكل عادي .. غير ذلك ، مازلت مصر :) على أن الطريقه الأولى أفضل من هذه ، هل مره قمت بكتابه JButton وجعلت الEvent الخاص به في ملف ثاني ؟ بالطبع لأ ، اما سوف تستخدم inner class وتعمل كلاس يتعامل مع الحدث ، أو تعمل Annoymouse class داخل القوسين في الداله AddActionListener ، أو تجعل الكلاس يطبق الـActionListener وتعيد تعريف الداله actionPerformed داخل الكلاس ..

باختصار أجعل التعامل مع الevent في نفس الكلاس هو أفضل ، من وجهه نظري طبعا :) ..

قبل أن أنتهي أحب أوضح شيء ما وهو ان الطريقه السابقه لكي نتعامل مع الحدث الخاص بPopupMenu هي طريقه قديمه وكانت تستخدم قبل نسخ JDK 5 .. وللأسف ظهرت الكثير من الشكاوي في مواقع sun على تلك الداله isPopupTrigger ، حيث أنها تعتمد على النظام المستخدم ، ففي أنظمه NT (عائله ويندوز) هذا الحدث لا يولد الا عندما تفك الضغط على الزر الأيمن وبالتالي عليك التعامل هنا مع الداله mouseRealsed ، وفي أنظمه سولاري على ما أذكر كان الحدث يولد لحظه الضغط على الزر الأيمن mousePressed .. لذلك تجد الكثير من المقالات تذكر أن عليك اعاده تعريف تلك الدالتين لكي تنتهي من المشاكل وتعمل الداله بشكل جيد ..

أيضا بعض الأحيان لا تعمل هذه الداله بشكل جيد ،، لذلك يمكنك أستخدام الطريقه الثانيه وهي التعامل مع mousePressed وأظهر الpopup في حاله كان الزر الذي سبب الحدث هو الزر الأيمن .. وهو حل معقول ويعمل بشكل جيد ...

JKD 5 أضافت حل أخر ، وهي الداله setComponentPopupMenu وترسل لها الكائن pop وهي تتولى كل شيء .. لكن ظهرت مشكله أخرى :) (Bug ID: 6272233) وحلها بسيط وهو عمل MouseListener لكن لا تعرف داله أي شيء يعني empty Listener to the parent component ..

أضف هذه السطور الى الكلاس PopupMenuDemo في نهايه داله البناء ، وهكذا سوف يعمل البرنامج بدون الحاجه لكلاس أخر للتعامل event ..

 

[color= #003399;]JPanel panel [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]JPanel[color= #009900;]([color= #009900;])[color= #339933;];

panel.[color= #006633;]setComponentPopupMenu[color= #009900;](popupmenu[color= #009900;])[color= #339933;];

 panel.[color= #006633;]addMouseListener[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]MouseAdapter[color= #009900;]([color= #009900;]) [color= #009900;]{[color= #009900;]}[color= #009900;])[color= #339933;];

add[color= #009900;](panel[color= #009900;])[color= #339933;];

وعلى ما أظن أن الحل الأخير والخاص بJDK 5 هو أفضل الحلول ...

المعذره على الإطاله :) ...

بالتوفيق،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#8

معذرة ايه و إطالة ايه ده انت كتر خيرك

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

انا قبل ما أضيف اجزء الاخير

   1.
   2.
	  JPanel panel = new JPanel();
   3.
	  panel.setComponentPopupMenu(popupmenu);
   4.
	  panel.addMouseListener(new MouseAdapter() {});
   5.
	  add(panel);
   6.

كان بيدينى nullpointer exception

عشان مش عامل intialization ل

	private JPopupMenu popupmenu;

فقررت اعمل كده

	private JPopupMenu popupmenu=new JPopupMenu();

و مع ذلك أعطانى nullpointerexception

و لكن عند إضافة اللجزء الأخير من كود حضرتك اشتغل بس صدقنى مش فاهمها كويس

وضح السطر ده تقصد به ايه

وحلها بسيط وهو عمل MouseListener لكن لا تعرف داله أي شيء يعني empty Listener to the parent component

شكرا

#9

بالطبع في حال لم تعطي تستخدم المعامل new وتعمل كائن جديد ، سوف يكون لديك خطأ وهو Null Exception ، لأن الكائن (أو بالأصح Reference) سوف تكون قيمته Null .

بالنسبه للسطر الأخير :

panel.addMouseListener(new MouseAdapter() {});

فليس له علاقه بالخطأ الذي حصل معك، وظيفته عمل Listener للكمبونينت Panel فقط ، وأصلا كما ذكرت الداله setComponentPopup تتعامل مع هذا الحدث ، لكن بين موقع sun صدور Bug اذا لم نضع هذه الListener فارغه سوف يتسبب ذلك في بعض الأحيان عدم ظهور الPopup ... متى؟ الله أعلم :) .. هذه Bug وهذه الحل من Sun لذلك نستخدم الحل ونبتعد عن المشاكل :) .

تأكد من برنامجك مره أخرى ، وسوف يعمل أن شاء الله ..

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#10

شكرا لردك

الله معك

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