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

كيف اوفق بين JButton+JTextField+...+.. JLable

مغلق
بدأه - a l t - في 10 ديسمبر 2006 · 12 رد · 1,494 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

في الكود التالي استخدمة 4 methods لانشاء4 JPanel تختلف محتويات كل Panel عن محتويات الاخر

ما اريده هو كيف اقلل عدد methods من 4 الى واحده فقط .

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

 class MyGUI2{

	public MyGUI2(){
		JFrame fram=new JFrame("View");
		fram.setLayout(new FlowLayout());
		fram.add(getPanelCheckboxs("Snap to Grid","Shaw Grid"));
		fram.add(getPanelLabels("X","Y"));
		fram.add(getPanelFields("",""));
		fram.add(getPanelButton("OK","CANCEL","HELP"));
		fram.pack();
		fram.setLocationRelativeTo(fram);
		fram.setVisible(true);
	}

	private JPanel getPanelCheckboxs(String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)gridPanel.add(new JCheckBox(text));
		return gridPanel;
	}
	private JPanel getPanelLabels(String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)gridPanel.add(new JLabel(text));
		return gridPanel;
	}
	private JPanel getPanelFields(String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)gridPanel.add(new JTextField(10));
		return gridPanel;
	}
	private JPanel getPanelButton(String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)gridPanel.add(new JButton(text));
		return gridPanel;
	}

	public static void main(String[]args){
		new MyGUI2();
	}
}

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

اتمنى منكم التوجيه

	public MyGUI2(){
		JFrame fram=new JFrame("View");
		fram.setLayout(new FlowLayout());
		fram.add(getPanel(new JCheckBox(), "Snap to Grid","Shaw Grid"));
		fram.add(getPanel(new JLabel(), "X","Y"));
		fram.add(getPanel(new JTextField(), "",""));
		fram.add(getPanel(new JButton(), "OK","CANCEL","HELP"));
		fram.pack();
		fram.setLocationRelativeTo(fram);
		fram.setVisible(true);
	}

	private JPanel getPanel(JComponent component, String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		/*
		 *	
		 */
		return gridPanel;
	}

و شكرا

11_03_06_12_48_57_1142110137Image(_66).jpg

#2
	private JPanel getPanel(JComponent component, String...texts){
		 component = new JPanel(new GridLayout(texts.length,1)); 

		 return (JPanel)component;
	 }

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#3

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

	private JPanel getPanel(JComponent component, String...texts){
		String type=component.getClass().getName().toString();

		if(type.equals("javax.swing.JCheckBox")){
		component = new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)component.add(new JCheckBox(text));
		}

		if(type.equals("javax.swing.JLabel")){
		component= new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)component.add(new JLabel(text));
		}

		if(type.equals("javax.swing.JTextField")){
		component= new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)component.add(new JTextField(10));
	   }

	   if(type.equals("javax.swing.JButton")){
		component= new JPanel(new GridLayout(texts.length,1));
		for(String text:texts)component.add(new JButton(text));
	   }

		 return (JPanel)component;
	 }

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#4

قد نختلف في الأجوبة،، لكن في النهاية،، ماذا تريد بالضبط عمله؟

هل تريد فقط هذه العمليات؟ أو بالخصوص، هل تريد هذه المجموعة من الأدوات JLabel والتي ذكرتها،، أم تريد عمل أشياء أخرى أيضا؟

وأسألك أيضا سؤالا آخر.. ماذا تريد بهذه الأشكال؟ هل ستصنع برنامجا معينا وظيفته الرسم؟

لماذا لا تستخدم Netbeans للرسم؟

وللفعالية الأكبر،، ماذا تريد بالأشكال بلا أفعال أو ActionListeners?

الموضوع يحتاج إلى توضيح أكثر حتى نحدد لك أي الطرق أفضل!

بالتوفيق!

#5

شكرا يا nardien28 قمت بتغيير بسيط على فكرتك لتكون كالتالي ...

	public MyGUI3(){
		JFrame fram=new JFrame("View");
		fram.setLayout(new FlowLayout());
		fram.add(getPanel("JCheckBox", "Snap to Grid","Shaw Grid"));
		fram.add(getPanel("JLabel", "X","Y"));
		fram.add(getPanel("JTextField", "",""));
		fram.add(getPanel("JButton", "OK","CANCEL","HELP"));
		fram.pack();
		fram.setLocationRelativeTo(fram);
		fram.setVisible(true);
	}

	private JPanel getPanel(String componentType, String...texts){
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		if(componentType.equals("JCheckBox"))for(String text:texts)gridPanel.add(new JCheckBox(text));
		else if(componentType.equals("JLabel"))for(String text:texts)gridPanel.add(new JLabel(text));
		else if(componentType.equals("JTextField"))for(String text:texts)gridPanel.add(new JTextField(10));
		else if(componentType.equals("JButton"))for(String text:texts)gridPanel.add(new JButton(text));
		return gridPanel;
	}

11_03_06_12_48_57_1142110137Image(_66).jpg

#6
حسام الملحم أبومازن كتب:
قد نختلف في الأجوبة،، لكن في النهاية،، ماذا تريد بالضبط عمله؟

هل تريد فقط هذه العمليات؟ أو بالخصوص، هل تريد هذه المجموعة من الأدوات JLabel والتي ذكرتها،، أم تريد عمل أشياء أخرى أيضا؟

وأسألك أيضا سؤالا آخر.. ماذا تريد بهذه الأشكال؟ هل ستصنع برنامجا معينا وظيفته الرسم؟

لماذا لا تستخدم Netbeans للرسم؟

وللفعالية الأكبر،، ماذا تريد بالأشكال بلا أفعال أو ActionListeners?

الموضوع يحتاج إلى توضيح أكثر حتى نحدد لك أي الطرق أفضل!

بالتوفيق!

أخي ابومازن لاحظ الكائن الذي تعود به الطريقة getPanel في الرد السابق ، فهذا هو المطلوب بعينه حيث ارسل لها اي نوع من الادوات مثل JLabel لتعود ب JPanel يحتوي على العدد المطلوب من labels .

هناك ادوات اخرى مثل JPasswordField وغيرها ، لكن تشترك جميعها بإحتوائها على الطريقة setText و addActionListener

وبالمناسبة يمكنني ارسال ActionListeners كبارامتر للطريقة نفسها على هيئة List<ActionListeners> l.

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

تعدد اوامر if وتزايد مع تزايد المكونات.

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

وشكرا

11_03_06_12_48_57_1142110137Image(_66).jpg

#7
اقتباس
شكرا يا nardien28 قمت بتغيير بسيط على فكرتك لتكون كالتالي ...

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

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

فكرتك شغاله وصحيحه 100 % ... بس طريقتي ( فكرت فيها انت قبلي ) أزبط واحلى تصميميا

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

تم تعديل هذه المشاركة بواسطة nardien28 في 11 ديسمبر 2006 في 14:19

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#8

1 - لو أردت استخدام البرمجة العمومية لاستخدمتها في تغليف المكونات الرسومية مثل JTextField و JLabel وغيرها..

وليس مع JPanel فالطريقة لن ترجع الى بهذا الاخير.

private JPanel getPanel(JComponent component, String...texts){
		String type=component.getClass().getName().toString();
		JPanel gridPanel = new JPanel(new GridLayout(texts.length,1));
		if(type.equals("javax.swing.JCheckBox"))for(String text:texts)gridPanel.add(new JCheckBox(text));
		else if(type.equals("javax.swing.JLabel"))for(String text:texts)gridPanel.add(new JLabel(text));
		else if(type.equals("javax.swing.JTextField"))for(String text:texts)gridPanel.add(new JTextField(10));
		else if(type.equals("javax.swing.JButton"))for(String text:texts)gridPanel.add(new JButton(text));
		else;
		return gridPanel;
	}

2 - عندما ارغب في استخدام هذه الطريقة فيتوجب على إنشاء كائن جديد لا حاجة لي فيه سوى تعرّف الطريقه getPanel الى نوعه، ثم إعادة انشائة داخل الطريقة من جديد مثال

getPanel(new JButton(), "OK","CANCEL","HELP")

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

3 - وهو المهم واساس تبادل الاراء ، لازلت مضر الى تعريف جميع المكونات الرسومية التي سأستخدمها داخل الطريقة.

بمعني آخر لو اردت انشاء JPanel يحتوي على JPasswordField او TextArea أو ..أو.. فيجب على إعادت بناء الطريقة JPanel من جديد ..!

وهذا الذي لا اريده ..

وشكرا لاهتمامك

تم تعديل هذه المشاركة بواسطة - a l t - في 11 ديسمبر 2006 في 15:05

11_03_06_12_48_57_1142110137Image(_66).jpg

#9

كيف حالكم؟

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

1- تستطيع تمرير أي نوع من التغيرات المناسبة للشيء الذي تريد صنعه،، String, ActionListener أو أي شيء آخر.

2- تستطيع إضافة أنواع كثيرة من الأشكال،، كل شكل تستطيع الرجوع إليه من خلال نوع معين مسمى باسم يعجبك!

   import javax.swing.*;
   import java.awt.*;
   import java.awt.event.*;
   import java.awt.event.ActionListener;
   import java.util.*;
	class TestMe{
	  Map<String, PanelStrategy>strategies=new HashMap<String, PanelStrategy>();   
	   public TestMe(){
		 init();		
		 JFrame fram=new JFrame("View");
		 fram.setLayout(new FlowLayout());
		 fram.add(getPanel("checkboxes","Snap to Grid","Shaw Grid"));
		 fram.add(getPanel("labels","X","Y"));
		 fram.add(getPanel("textfields","",""));
		 fram.add(getPanel("buttons",
				new AbstractAction("OK"){
				   public void actionPerformed(ActionEvent ae){
				  //Do something
				  }

			   },
				new AbstractAction("Cancel"){
				   public void actionPerformed(ActionEvent ae){
				  //Do something
				  }

			   }));
		 fram.pack();
		 fram.setLocationRelativeTo(fram);
		 fram.setVisible(true);
		 fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	  }

	   private JComponent getPanel(String type, Object...args){
		 PanelStrategy s=strategies.get(type);
		 return s.generate(args);
	  }
	   public static void main(String[]args){
		 new TestMe();
	  }

	   public void init(){
		 strategies.put("labels", 
				new PanelStrategy(){
				   public JComponent generate(Object...list){
					 JPanel gridPanel = new JPanel(new GridLayout(list.length,1));
					 for(Object text:list)
						gridPanel.add(new JLabel(text.toString()));
					 return gridPanel;
				  }
			   });
		 strategies.put("checkboxes", 
				new PanelStrategy(){
				   public JComponent generate(Object...list){
					 JPanel gridPanel = new JPanel(new GridLayout(list.length,1));
					 for(Object text:list)
						gridPanel.add(new JCheckBox(text.toString()));
					 return gridPanel;
				  }
			   });
		 strategies.put("buttons", 
				new PanelStrategy(){
				   public JComponent generate(Object...list){
					 JPanel gridPanel = new JPanel(new GridLayout(list.length,1));
					 for(Object text:list)
						gridPanel.add(new JButton((Action)text));
					 return gridPanel;
				  }
			   });
		 strategies.put("textfields", 
				new PanelStrategy(){
				   public JComponent generate(Object...list){
					 JPanel gridPanel = new JPanel(new GridLayout(list.length,1));
					 for(Object text:list)
						gridPanel.add(new JTextField(text.toString(),10));
					 return gridPanel;
				  }
			   });
	  }
   }

	interface PanelStrategy{
	   public JComponent generate(Object...list);
   }

لاحظ أنك تستطيع إضافة أي شكل جديد بكتابة النموذج:

stategies.put("Name", new PanelStrategy(){...});

لاحظ أن الذي يرجع JComponent وبهذا تحصل على تنوع أكبر.

بالتوفيق!

#10

هذه الطريقة افضل من طريقتي الاولى،

كنت واثق بانه يتوجب على جمع الادوات في interface ولكني لم اتصور الطريقة.

ساعود بالكود بعد التعديل عليه بما يناسبني

جزاك الله ألف خير يا ابو مازن

11_03_06_12_48_57_1142110137Image(_66).jpg

#11

أخي أبو مازن .. ما رأيك باستخدام WeakHashMap عوضا عن HashMap كي يقوم Garbage Collector بتحرير المدخلات بعد الانتهاء من عملية الرسم ويحول دون استهلاك الذاكرة ..

class TestMe{
   Map<String,PanelStrategy> strategies = 
								new WeakHashMap<String, PanelStrategy>();


	public TestMe() {
		JFrame fram = new JFrame("View");
		fram.setLayout(new FlowLayout());

		 init();
		fram.add(getPanel("checkboxes", "Snap to Grid","Shaw Grid"));
		fram.add(getPanel("labels", "X", "Y"));
		fram.add(getPanel("textfields", "", ""));


				fram.add(getPanel(new String("buttons"),
				 new AbstractAction("OK"){
				 public void actionPerformed(ActionEvent ae){ … }
				  },
			   new AbstractAction("Cancel"){
			   public void actionPerformed(ActionEvent ae){… }
				}
			  ));

		fram.pack();
		fram.setLocationRelativeTo(fram);
		fram.setVisible(true);
		fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		System.gc();
		System.out.println("WeakHashMap Size :"+strategies.size());

	}


	private JComponent getPanel(String type, Object ...args) {
		PanelStrategy s = strategies.get(type);
		return s.generate(args);
	}



	public static void main(String[] args) {
		TestMe myclass = new TestMe();
	}

	public void init() {

		strategies.put(new String("labels"),
					   new PanelStrategy() {
			public JComponent generate(Object ...list) {
				JPanel gridPanel = new JPanel(new GridLayout(list.length, 1));
				for (Object text : list) {
					gridPanel.add(new JLabel(text.toString()));
				}
				return gridPanel;
			}
		});
		strategies.put(new String("checkboxes"),
					   new PanelStrategy() {
			public JComponent generate(Object ...list) {
				JPanel gridPanel = new JPanel(new GridLayout(list.length, 1));
				for (Object text : list) {
					gridPanel.add(new JCheckBox(text.toString()));
				}
				return gridPanel;
			}
		});
		strategies.put(new String("buttons"),
					   new PanelStrategy() {
			public JComponent generate(Object ...list) {
				JPanel gridPanel = new JPanel(new GridLayout(list.length, 1));
				for (Object text : list) {
					gridPanel.add(new JButton((Action) text));
				}
				return gridPanel;
			}
		});
		strategies.put(new String("textfields"),
					   new PanelStrategy() {
			public JComponent generate(Object ...list) {
				JPanel gridPanel = new JPanel(new GridLayout(list.length, 1));
				for (Object text : list) {
					gridPanel.add(new JTextField(text.toString(), 10));
				}
				return gridPanel;
			}
		});

	}

}

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#12

ليس هنا نستخدم WeakHashMap. لعدة أمور:

1- السائل يطلب طريقة من خلالها سيستطيع إضافة JPanel مخصصة متى أراد. ولو استخدمنا WeakHashMap لما استطاع فعل ذلك لأن المعلومات ستضيع، وسيحتاج إلى قراءتها من جديد، ولا أدري أين الفائدة هنا!

2- الذاكرة المستخدمة لتكوين أي PanelStrategy بسيطة جدا ولا تكاد تذكر حتى لو عندك 100 وحدة من هذه الفئة البسيطة.

3- مفاتيح الخارطة أو HashMap Keys عبارة عن Strings ومن هنا نعرف أن عملية كنس أو مسح Strings غير مفيدة لأن المبرمج قد يستخدم هذه الأسماء أو Strings ويضعها في Victor ولن تستطيع كنس أي شيءـ حتى لو قلت System.gc! بمعنى آخر،، ربما يكون هدف البرنامج أن يستطيع المستخدم التحكم بمظهر JPanel من خلال اختيار النوع String من قائمة JComboBox وهذا يعني أن الكلمات مستخدمة ولن تصبح قابلة للكنس، وهذا يعني أنه لا فائدة WeakHashMap هنا.

4- تستخدم WeakHashMap إذا كانت المفاتيح نفسها قد لا تستخدم لاحقا. وقد تكون المشار إليه في الخريطة مستخدما.

بمعنى آخر أن وظيفة هذه الفئة كنس المفاتيح المهملة وليس كنس الأشياء المشار إليها أو Values أو PanelStrategy نفسها!

تستطيعين من خلال شفرة ObjectDatabase رؤية كيفية الاستفادة من WeakHashMaps أو WeakReferences الخ.

لاحظي أن البيانات كثيرة وبعضها كبير وقد لا تستخدم ولهذا أستخدم هذه الفئات، مع التنويه أن استخدام هذه الفئات لا يعني أني سأستخدم الأمر System.gc. إلا أن الكانس سوف يفعل هذا متى ما رأى أنه أصبح ضروريا.

أرجو أن يكون هذا مفيدا. وقد أكون على خطأ.

بالتوفيق!

#13

توجد نقطة خامسة أيضا كانت في ذهني ونسيتها.

أعتقد تستطيع تحرير الذاكرة بعمل حذف للقائمة:

map.clear();

وبهذا وفرنا الذاكرة لو أردنا هذا!

بالتوفيق!

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…