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

مشكلة فى الcardlayout

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

سلام

فى محاولة لعمل فكرة ما لا أتطرق ها الآن و لكن فى هذه الفكرة أردت ان استخدم الlayoutmanager الى اسمه

cardLayout()

و ذلك بعمل كود بسيط

عامل 2 buttons (triangle button , rectangle button)

اول ما اضغط على الزرار triangle يفتح لى بانل مكتوب عليها ال text الى على هذا الزرار

و هكذا مع الزرار الاخر

و لكن هناك مشاكل بالكود

الذى كتبته

هاك شفرته

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CardLayoutDemo extends JFrame {
	JPanel mainPanel ,buttonpanel,trianglePanel,rectanglepanel;
	JButton Triangle,rectangle;
	public CardLayoutDemo(){
		mainPanel=new JPanel(new CardLayout());
		buttonpanel=new JPanel(new FlowLayout());
		trianglePanel=new JPanel();
		rectanglepanel=new JPanel();

		Triangle=new JButton("Triangle");
		Triangle.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				CardLayout c=new CardLayout();
				c.show(mainPanel, "triangle");
			}
		});
		buttonpanel.add(Triangle);
		trianglePanel.add(Triangle.getText(),this);

		rectangle=new JButton("rectangle");
		buttonpanel.add(rectangle);
		rectanglepanel.add(rectangle.getText(),this);

		mainPanel.add(trianglePanel);
		mainPanel.add(rectanglepanel);


		getContentPane().add(buttonpanel,BorderLayout.CENTER);
	}
	public static void main(String[]args){
		JFrame frame=new CardLayoutDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		 frame.setResizable(false);
		frame.setVisible(true);
		frame.setSize(new Dimension(500,250));
	}
}
#2

السلام عليكم

الـ CardLayout الذي ستتعامل معه عند الضغط على الزر يجب أن يكون نفس الـ CardLayout الذي أدرجته في mainPanel

في كودك استخدمت نسختين مختلفتين من الـ CardLayout

واحدة هنا :

mainPanel=new JPanel(new CardLayout());

و الثانية هنا :

CardLayout c = new CardLayout();
c.show(mainPanel, "triangle");

الكود بعد التصحيح :

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CardLayoutDemo extends JFrame{

	JPanel mainPanel, buttonpanel, trianglePanel, rectanglepanel;
	JButton Triangle, rectangle;
	CardLayout card;

	public CardLayoutDemo() {

		card = new CardLayout();		
		mainPanel = new JPanel(card);

		buttonpanel = new JPanel(new FlowLayout());
		trianglePanel = new JPanel();
		rectanglepanel = new JPanel();

		Triangle = new JButton("Triangle");
		Triangle.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(mainPanel, "triangle");
			}
		});

		buttonpanel.add(Triangle);
		trianglePanel.add(new JLabel(Triangle.getText()));

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

		buttonpanel.add(rectangle);
		rectanglepanel.add(new JLabel(rectangle.getText()));

		mainPanel.add(trianglePanel,"triangle");
		mainPanel.add(rectanglepanel,"rectangle");

		getContentPane().add(mainPanel, BorderLayout.CENTER);
		getContentPane().add(buttonpanel, BorderLayout.PAGE_END);

	}

	public static void main(String[] args) {
		JFrame frame = new CardLayoutDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		frame.setVisible(true);
		frame.setSize(new Dimension(500, 250));
	}
}

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

#3

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

مكنتش على بالى انا لازم الcard يكون موحد

بس ليا شوية استفسارات :

1- حضرتك كاتب

	 trianglePanel.add(new JLabel(Triangle.getText()));

و انا كنت كاتب

trianglePanel.add(Triangle.getText(),this);

بيدينى exception بالشكل ده

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container

ليه ؟؟؟

هل عشان انا حاطط ال string مباشرة على البانل و من الواجب انى اضعه اولا على component مثل ال label ثم اضعه على بانل

2 - لما بتكتب

  getContentPane().add(buttonpanel, BorderLayout.PAGE_END);

بيظهر الcard

لكن borderlayout .center أو غيره لا يظهر فى حين ان من المنطقى ان center يظهر الcard

لماذا لا يظهر ؟؟؟

3- اول ما بنفذ الكود بتاعك بيظهر الكرد triangel

انا مش عاوز اى كارد يظهر غير لما اضغط انا الbutton

ازاى اقدر امنع ظهور اى كارد لحين ما اضغط ال button

معلش اسئلتى كتير لكن استحملنى مستر خالد

بيشوى عاطف

#4

1.

اقتباس
هل عشان انا حاطط ال string مباشرة على البانل و من الواجب انى اضعه اولا على component مثل ال label ثم اضعه على بانل

تماماً , الـ Panel لا يقبل أن تضيف عليه إلا component (أو popupmenu)

2.

اقتباس
لكن borderlayout .center أو غيره لا يظهر فى حين ان من المنطقى ان center يظهر الcard

لماذا لا يظهر ؟؟؟

عندما تستعمل الـ BorderLayout يمكنك أن توزع عليه خمس مكونات على الأكثر في المواضع التالية :

PAGE_START القسم العلوي

PAGE_END القسم السفلي

LINE_START القسم اليساري

LINE_END القسم اليميني

CENTER المنتصف

post-152370-1227573716_thumb.png

أنا وضعت mainPanel في المنتصف و buttonpanel في الأسفل

getContentPane().add(mainPanel, BorderLayout.CENTER);
getContentPane().add(buttonpanel, BorderLayout.PAGE_END);

إذا وضعت الـ mainPanel و الـ buttonpanel في المنتصف

getContentPane().add(mainPanel, BorderLayout.CENTER);
getContentPane().add(buttonpanel, BorderLayout.CENTER);

فسيظهر فقط آخر مكون أضفته و هو buttonpanel و لن يظهر mainPanel لأنه تم رسم buttonpanel فوقه

3.

اقتباس
اول ما بنفذ الكود بتاعك بيظهر الكرد triangel

انا مش عاوز اى كارد يظهر غير لما اضغط انا الbutton

ازاى اقدر امنع ظهور اى كارد لحين ما اضغط ال button

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

اقتباس
Conceptually, each component that a CardLayout manages is like a playing card or trading card in a stack, where only the top card is visible at any time.

الحل الوحيد هو أن تضيف إلى الـ CardLayout لوحة (panel) فارغة تكون هي الظاهرة في البداية

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

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

أنا اسمي أبو خالد ( :S )

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

#5

شكرا لإجابتك المثرية

ربنا يباركك

بيشوى

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