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

إدخال menus عبر List

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

كنت أجرب كيفية إدخال عدد من ال menus بالتعامل مع ال :

  private List<JMenu[]> list = new ArrayList<JMenu[]>();

بدلاً من اِستعمال المصفوفة كعادتى .

و لكن واجهت مشكلة فى كيفية الحصول على ال menus من ال List

انظروا ال code :

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

import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class ListTest extends JFrame {

    private JMenu[] menu;
    private JMenuBar bar;
    private List<JMenu[]> list = new ArrayList<JMenu[]>();
    private String[] menuNames = {"File", "Edit", "Tool", "Help"};

    public ListTest() {
        bar = new JMenuBar();
        menu = new JMenu[menuNames.length];
        for (int i = 0; i < menuNames.length; ++i) {
            menu = new JMenu(menuNames);
            list.add(menu);
            bar.add(list.get(i));   //الخطأ هنا 
        }
        setJMenuBar(bar);
    }

    public static void main(String[] args) {
        ListTest listTest = new ListTest();
        listTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        listTest.setVisible(true);
        listTest.setLocationRelativeTo(null);
        listTest.setSize(new Dimension(600, 300));
    }
}

هل استعمالى خاطئ لل List ؟؟

شكراً مقدماً

#2

اخى العزيز mr.beshoy

انت تستخدم ال ArrayList لتخزن داخلها القوائم ثم تعيد استخدامها مرة اخرى

وهى فكرة جميلة لكنك قمت بتخزين مصفوفة من القوائم []JMenu داخل كل عنصر element فى ArrayList

ثم تعود وتستخدمها كأنها قائمة واحدة JMenuItem داخل كل عنصر

انظر ال code التالى ولاحظ الفرق

import java.awt.Dimension;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class ListTest extends JFrame {

	private JMenu menu;// not JMenu[]
	private JMenuBar bar;
	private List<JMenu> list = new ArrayList<JMenu>();
	private String[] menuNames = { "File", "Edit", "Tool", "Help" };

	public ListTest() {
 	bar = new JMenuBar();
 	menu = new JMenu("main");
 	for (int i = 0; i < menuNames.length; ++i) {
 	menu = new JMenu(menuNames);// note this carefully
 	list.add(menu);
 	bar.add(list.get(i));
 	}
 	setJMenuBar(bar);
	}

	public static void main(String[] args) {
 	ListTest listTest = new ListTest();
 	listTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	listTest.setSize(new Dimension(600, 300));
 	listTest.setLocationRelativeTo(null);
 	listTest.setVisible(true);
	}
}

تحياتى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 5 مايو 2010 في 14:39


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#3

لقد فهمت الخطأ .

و لكن لدى سوال :

جربنا أن نخزن القوائم داخل مصوفة . و نجحت

و مرة أخرى جربنا أن نخزن القوائم داخل List من نوع JMenu

ما الميزة فى كل طريقة أو الفرق بين الأثنين ؟؟

شكراً

#4

أنا موش فاهم إنت قصدك إيه من التخزين يا بيشوي,

بس أنا أظن إنت ممكن تستخدم التخزين عشان تعمل caching , بس هل ال إنشاء القوائم مكلف عشان عشان تعمل caching ؟؟

ممكن توضح وجهة نظرك من تخزينها في list ؟

#5

لعمل القوائم ممكن نخزنها كلها داخل مصفوفة كالتالى :

private JMenu[]menu;
private JMenuBar bar;
private String[] menuNames = {"File", "Edit", "Tool", "Help"};
/////////////////////////////////////////////////////////////////
menu=new JMenu[menuNames.length];
for(int =0;i<menuNames.lenth;++i){
	menu=new JMenu(menuNames);
	bar.add(menu);
}
setJmenuBar(bar);

و ممكن نخزنها داخل List كالطريقة فى المشاركة التى ساعدنى فيها الأخ محمد .

الى بسأله أى طريقة أفضل ؟!!

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

مش قصة مكلف يا هويدى : هو قصة أنه طريقة منظمة فى الكود ، وعلى حد علمى أنك كده معاك مساحة unlimited للتخزين سواء فى هذا الموقف أو غيره .

أحب أسمع رأيكم

شكراً

تم تعديل هذه المشاركة بواسطة mr.beshoy في 5 مايو 2010 في 16:34

#6

السلام عليكم

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

وهذا واضح اذا كنت ستضيف الكثير من القوائم فى تطبيقك

اليك مثلا الفئة على الطريقة التقليدية

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class ListTest extends JFrame {

	private JMenu fileMenu;
	private JMenu editMenu;
	private JMenu toolMenu;
	private JMenu helpMenu;
	private JMenuBar bar;

	public ListTest() {
 	bar = new JMenuBar();
 	fileMenu = new JMenu("File");
 	editMenu = new JMenu("Edit");
 	toolMenu = new JMenu("Tool");
 	helpMenu = new JMenu("Help");
 	bar.add(fileMenu);
 	bar.add(editMenu);
 	bar.add(toolMenu);
 	bar.add(helpMenu);

 	setJMenuBar(bar);
	}

	public static void main(String[] args) {
 	ListTest listTest = new ListTest();
 	listTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	listTest.setSize(new Dimension(600, 300));
 	listTest.setLocationRelativeTo(null);
 	listTest.setVisible(true);
	}
}

ونفس الفئة على طريقة الاخ بيشوى

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class ListTest extends JFrame {

	private JMenu[] menu;// not JMenu[]
	private JMenuBar bar;
	private String[] menuNames = {"File", "Edit", "Tool", "Help"};

	public ListTest() {
 	bar = new JMenuBar();
 	menu = new JMenu[menuNames.length];
 	for (int i = 0; i < menuNames.length; ++i) {
 	menu = new JMenu(menuNames);// note this carefully
 	bar.add(menu);
 	}
 	setJMenuBar(bar);
	}

	public static void main(String[] args) {
 	ListTest listTest = new ListTest();
 	listTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	listTest.setSize(new Dimension(600, 300));
 	listTest.setLocationRelativeTo(null);
 	listTest.setVisible(true);
	}
}

لاحظ الفرق الواضح فى الشفرة ومازلنا بصدد اضافة القوائم الرئيسية JMenu فقط

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

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

تحياتى

****

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 5 مايو 2010 في 21:20


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#7

تمام يا أخ محمد . أنها ستوفر فعلاً . و لكن مازلت بسأل سوالى

التوفير ممكن يكون باستعمال ال Array كما أوضحت أو بستعمال ال List

أيهما أفضل ؟؟ و لماذا؟؟

شكراً

#8

عزيزى بيشوى

استخدام ال ArrayList اقوى طبعا لانه لن يقيدك بطول معين للمصفوفة

ويسمح لك بالاضافة والحذف للعناصر بحرية اكبر

ولكنك تعود وتربط ال ArrayList بطول مصفوفة الاسماء menuNames وذلك عند استخدامك للشفرة التالية

for (int i = 0; i < menuNames.length; ++i) {// note using menuNames.length
 	menu = new JMenu(menuNames);
 	list.add(menu);
 	bar.add(list.get(i));
 	}

وهنا يصبح الاستخدام المباشر للمصفوفة []JMenu افضل

بما اننا نبحث عن التوفير فى الشفرة

انظر

for (int i = 0; i < menuNames.length; ++i) {
 	menu = new JMenu(menuNames);
 	bar.add(menu);// this is in place of two rows of code
 	}

مادمت مرتبطا بطول مصفوفة الاسماء فالطريقة الثانية []JMenu افضل

تحياتى

****


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#9

تمام . كل الفكرة كنت أريد أن اتاكد من ان ال LIST تتمع بتلك الميزات الى قولتها

شكراً لك و لتعبك معى .

#10

لا تعب ولاحاجة اخى انا قطعا استفيد من مشاركاتي مع زملائى اعضاء المنتدى فى اى موضوع او مناقشة

وهذه افضل طريقة لاكتساب الخبرة + اكتساب الحسنات :cash:

تحياتى

***************

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 5 مايو 2010 في 22:30


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

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