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

مشكلة فى الcardlayout فى كود( بسيط جداً ) الهدف منه حساب مساحات الأشكال الهندسية

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

سلام

هذا الكود

الهدف منه

حساب مسحات الأشكال الهندسية

من مستطيل مربع دائرة

هذا الهدف المراد الوصول اليه فى النهاية

و لكن الهدف البرمجى من هذا الكود التدرب على فكرة الinheritance

و لكن هى لا تظهر فى هذه الشيفرة

و لكن ستظهر عندما أقونم بعمل الكلاسات الأخرى

ولكن المشكلة الاول و الهامشية فى الكود هى انى عندما اضغط على زرار الrectangle

لا تظهر الcard المحتوية على البانل

و هاك الشيفرة

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Geometry extends JFrame {

	private JPanel mainpanel,  buttonpanel;
	private JButton circlebutton,  rectangelbutton,  trianglebutton;
	private TitledBorder border=new TitledBorder("Geometry shape");
	private RectanglDemo rect=new RectanglDemo();
	public Geometry() {

		mainpanel = new JPanel();
		buttonpanel=new JPanel(new GridLayout(3,1));
		getContentPane().add(rect,BorderLayout.PAGE_END);
		buttonpanel.setPreferredSize(new Dimension(150,200));
		buttonpanel.setBackground(Color.BLUE);
		circlebutton = new JButton("Circle");
		rectangelbutton = new JButton("Rectangel");
		rectangelbutton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
			   rect.rectangle();
			}
		});
		trianglebutton = new JButton("Triangle");
		buttonpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		border.setTitleJustification(TitledBorder.LEFT);
		buttonpanel.setBorder(BorderFactory.createTitledBorder(border));
		circlebutton=new JButton("Circle");
		rectangelbutton=new JButton("Rectangle");
		trianglebutton=new JButton("Triangle");
		buttonpanel.add(circlebutton);
		buttonpanel.add(rectangelbutton);
		buttonpanel.add(trianglebutton);
		mainpanel.add(buttonpanel);
		getContentPane().add(mainpanel,BorderLayout.WEST);
	}

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

import java.awt.CardLayout;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class RectanglDemo extends JPanel {

	private CardLayout card;
	private JLabel length,  width;
	private JTextField lenghtfield,widthfield;
	private JPanel mainpanel1,rectpanel;
	public RectanglDemo() {
		rectangle();

	}

	public  void rectangle() {
		card=new CardLayout();
		mainpanel1=new JPanel(card);

		rectpanel=new JPanel(new GridLayout(2,1));

		length=new JLabel("Enter length");
		lenghtfield=new JTextField(10);

		width=new JLabel("Enter width");
		widthfield=new JTextField(10);

		rectpanel.add(length);
		rectpanel.add(lenghtfield);
		rectpanel.add(width);
		rectpanel.add(widthfield);

		mainpanel1.add(rectpanel,"rectangle");

		card.show(mainpanel1,"retangle");

	}
}

و شكرا مسبقاً

#2

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

اجعل الـ CardLayout في الصف Geometry , بحيث تكون محتوياته هي RectanglDemo و أخواتها التي ستنشأها من أجل بقية الأشكال .

في الصف Geometry , عند الضغط على أحد الأزرار ( مثلاً rectangelbutton ) دع الـ CardLayout يقوم بإظهار (باستخدام show) الـ panel المناسبة (مثلاً RectanglDemo)

أبو خالد السوري

#3

أتمنى لوأحتلت مشكلتك إنك ترفق البرنامج مع الملحقات عشان أفهم الفكره وأستفيد منها وشكراً :)


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#4

سلام مستر أبو خالد

بص انا ال card الخاصة بالزرار rectangle & circle

بيظهروا مع بعض مرة واحدة

انا عاوز اضغط الى الrect يدينى الكارد الخاصة بيه

أضغط على ال circle يدينى الكارد الخاصة بيه

و هاك الكود

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Geometry extends JFrame {

	private JPanel mainpanel,  buttonpanel,  rectangle,  circle,  cardrectpanel,  cardcirclepanel,maincardpanel;
	private JButton circlebutton,  rectangelbutton,  trianglebutton;
	private TitledBorder border = new TitledBorder("Geometry shape");
	private CardLayout card;
	private RectanglDemo rect = new RectanglDemo();
	private CircleDemo cir = new CircleDemo();

	public Geometry() {
		card = new CardLayout();

		maincardpanel=new JPanel();
		cardrectpanel = new JPanel();
		cardcirclepanel = new JPanel();

		rectangle = new JPanel(card);
		circle = new JPanel(card);

		maincardpanel.setBackground(Color.RED);
		maincardpanel.setPreferredSize(new Dimension(500, 400));

//		cardrectpanel.setBackground(Color.RED);
//		cardrectpanel.setPreferredSize(new Dimension(500, 400));

		rectangle.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		rectangle.setBorder(BorderFactory.createTitledBorder("retangle"));

		circle.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		circle.setBorder(BorderFactory.createTitledBorder("circle"));

		mainpanel = new JPanel();

		buttonpanel = new JPanel(new GridLayout(3, 1));
		buttonpanel.setPreferredSize(new Dimension(150, 200));
		buttonpanel.setBackground(Color.BLUE);

		circlebutton = new JButton("Circle");
		rectangelbutton = new JButton("Rectangel");
		trianglebutton = new JButton("Triangle");


		rectangle.add(rect.mainpanel1, "rectangle");
		rectangelbutton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				card.show(rectangle, "rectangle");
			}
		});

		circle.add(cir.maincirclepanel, "circle");
		circlebutton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				card.show(circle, "circle");
			}
		});

		buttonpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		border.setTitleJustification(TitledBorder.LEFT);
		buttonpanel.setBorder(BorderFactory.createTitledBorder(border));

		buttonpanel.add(circlebutton);
		buttonpanel.add(rectangelbutton);
		buttonpanel.add(trianglebutton);

		mainpanel.add(buttonpanel);

		maincardpanel.add(rectangle,"rectangle");
		maincardpanel.add(circle,"circle");

		getContentPane().add(mainpanel, BorderLayout.WEST);
		getContentPane().add(maincardpanel, BorderLayout.CENTER);

	}

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

الكلاس الخاص بال rectangle

import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class RectanglDemo extends JPanel {
	private JLabel length,  width;
	private JTextField lenghtfield,widthfield;
	public JPanel rectpanel,mainpanel1;
	public RectanglDemo() {
		rectangle();
	}
	public  void rectangle() {
		mainpanel1=new JPanel();
		rectpanel=new JPanel(new GridLayout(2,1));

		length=new JLabel("Enter length");
		lenghtfield=new JTextField(10);

		width=new JLabel("Enter width");
		widthfield=new JTextField(10);

		rectpanel.add(length);
		rectpanel.add(lenghtfield);
		rectpanel.add(width);
		rectpanel.add(widthfield);

		mainpanel1.add(rectpanel);
	}
}

الكلاس الخاص بال circle

import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class CircleDemo extends JPanel {
	JPanel circlepanel,maincirclepanel;
	JLabel radius,area;
	JTextField radiusfield,areafield;
	public CircleDemo(){
		Circle();
	}

	private void Circle() {
		maincirclepanel=new JPanel();
		circlepanel=new JPanel(new GridLayout(2,1));

		radius=new JLabel("Enter radius");
		radiusfield=new JTextField(10);

		area=new JLabel("area");
		areafield=new JTextField(10);

		circlepanel.add(radius);
		circlepanel.add(radiusfield);

		circlepanel.add(area);
		circlepanel.add(areafield);

		maincirclepanel.add(circlepanel);

	}
}

معلش استحملوا أسئلتى الغبية

سلام

بيشوى

#5

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

الكود الذي وضعته أخي بيشوي غير منظم بشكل جيد و يحوي الكثير من اللوحات (panel) التي لا داعي لها ..

على كل حال, قمت بتنظيمه قليلاً .. الشكل التالي يوضح تراكب اللوحات ..

post-152370-1228075967.png

الكود الجديد :

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Geometry extends JFrame {

	private JPanel mainpanel, buttonpanel, cardpanel;	
	private JButton circlebutton,  rectangelbutton,  trianglebutton;
	private TitledBorder border = new TitledBorder("Geometry shape");

	private CardLayout card;

	private RectanglDemo rect = new RectanglDemo();
	private CircleDemo cir = new CircleDemo();

	public Geometry() {
		card = new CardLayout();

		cardpanel = new JPanel(card);
		cardpanel.setBackground(Color.RED);
		cardpanel.setPreferredSize(new Dimension(500, 400));

		cardpanel.add(new JPanel(), ""); // empty panel to be shown initially
		cardpanel.add(rect, "rectangle");
		cardpanel.add(cir, "circle");

		mainpanel = new JPanel(new BorderLayout());

		buttonpanel = new JPanel(new GridLayout(3, 1));
		buttonpanel.setPreferredSize(new Dimension(150, 200));
		buttonpanel.setBackground(Color.BLUE);

		circlebutton = new JButton("Circle");
		circlebutton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardpanel, "circle");
			}
		});

		rectangelbutton = new JButton("Rectangel");
		rectangelbutton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardpanel, "rectangle");
			}
		});

		trianglebutton = new JButton("Triangle");

		buttonpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		border.setTitleJustification(TitledBorder.LEFT);
		buttonpanel.setBorder(BorderFactory.createTitledBorder(border));

		buttonpanel.add(circlebutton);
		buttonpanel.add(rectangelbutton);
		buttonpanel.add(trianglebutton);

		mainpanel.add(buttonpanel, BorderLayout.LINE_START);
		mainpanel.add(cardpanel, BorderLayout.CENTER);

		getContentPane().add(mainpanel);		
	}

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

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class RectanglDemo extends JPanel {

	private JLabel length, width;
	private JTextField lenghtfield, widthfield;

	public JPanel rectpanel;

	public RectanglDemo() {
		rectangle();
	}

	public void rectangle() {
		rectpanel = new JPanel(new GridLayout(2, 1));

		rectpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		rectpanel.setBorder(BorderFactory.createTitledBorder("rectangle"));

		length = new JLabel("Enter length");
		lenghtfield = new JTextField(10);

		width = new JLabel("Enter width");
		widthfield = new JTextField(10);

		rectpanel.add(length);
		rectpanel.add(lenghtfield);
		rectpanel.add(width);
		rectpanel.add(widthfield);

		add(rectpanel);
	}
}

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CircleDemo extends JPanel {
	JPanel circlepanel;

	JLabel radius, area;

	JTextField radiusfield, areafield;

	public CircleDemo() {
		Circle();
	}

	private void Circle() {
		circlepanel=new JPanel(new GridLayout(2,1));

		circlepanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		circlepanel.setBorder(BorderFactory.createTitledBorder("circle"));

		radius=new JLabel("Enter radius");
		radiusfield=new JTextField(10);

		area=new JLabel("area");
		areafield=new JTextField(10);

		circlepanel.add(radius);
		circlepanel.add(radiusfield);

		circlepanel.add(area);
		circlepanel.add(areafield);

		add(circlepanel);
	}
}

أبو خالد السوري

#6

شكرا جدا جدا مستر ابو خالد على إجابتك

بس ليا استفسار

عندما كتبت :

	 circlebutton = new JButton("Circle");
		circlebutton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardpanel, "circle");
			}
		});

من أين عرف انه يريد المناداة على الكلاس الخاص بالدائرة

و نفس السوال فى المستطيل

انا عشان كنت اعرفه انا عاوز الكلاس الخاص بالدائرة كنت بعمل كده

	 circle.add(cir.maincirclepanel, "circle");
		circlebutton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				card.show(circle, "circle");
			}
		});

كنت بضيف على البانل ال circle كل محتويات maincirclepanel عن طريق منادتها بال opject cir

انا حضرتك كات على طول card.show(cardpanel)

دون الإشارة انا هذه الكارد ستحتوى على ماذا؟

رجاء التوضيح

وشكرا جدا جدا لتعبك

ربنا يعوضك

بيشوى

معلش سوال تانى نسيت أدجه المرة الأولى

لون الكارد بانل مش بيبقى أحمر بيبقى اللون الرمادى الdefult بتاع البانل لماذا

؟؟؟

#7

في show البارامتر الأول هو الـ component الأب الذي يحوي البطاقات المختلفة (و هو cardpanel)

و البارامتر الثاني هو اسم البطاقة التي نريد إظهارها ("circle")

عندما أضفنا البطاقات المختلفة إلى cardpanel حددنا اسماً (string) خاصاً بكل بطاقة (معرف)

		cardpanel.add(rect, "rectangle");
		cardpanel.add(cir, "circle");

اقتباس
من أين عرف انه يريد المناداة على الكلاس الخاص بالدائرة

من خلال الاسم المعرف circle

اقتباس
The first argument in the show method is the container the CardLayout controls — that is, the container of the components the CardLayout manages. The second argument is the string that identifies the component to show. This string is the same string that was used when adding the component to the container.

http://java.sun.com/docs/books/tutorial/ui...ayout/card.html

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

كنت قد قمت بحذف اللوحة maincirclepanel و رسم محتوياتها مباشرة على الصف circleDemo كونه JPanel

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

cardpanel (بلونها الأحمر) لا تظهر إطلاقاً, الذي يظهر هو البطاقات التي عليها فقط (بلونها الرمادي).

بشكل افتراضي البطاقة التي أضيفت أولاً هي التي تظهر في البداية (قبل الضغط على أي زر) و هي بطاقة فارغة (new JPanel)

أبو خالد السوري

#8

وضحت الأمور مستر أبو خالد ..

شكراً جدا

ربنا يعوضك خير

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

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

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

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

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