Swing - الكلاس JSplitPane

Java Swing الكلاس JSplitPane

مقدمة Swing - الكلاس JSplitPane

الكلاس JSplitPane يسمى Split Pane و يستخدم لتقسيم الـ Frame إلى عدة أقسام مع إمكانية سحب الأقسام يدوياً.
إذاً الـ Split Pane يضيف Splitter في الـ Frame فيقسمها إلى قسمين أساسيين.
يستطيع المستخدم تحريك هذا الـ Splitter لتغيير حجم الأقسام الموجودة في الـ Frame لعرض محتواها بالشكل الذي يريده.

يمكن تحديد الـ Split Pane لتقسيم الـ Frame عامودياً أو أفقياً.
و يمكن تقسيم القسم الواحد إلى عدة أقسام أيضاً و هذا يسمى Nested Split Panes.

لجعل القسم الذي تريد إضافته في الـ Split Pane يظهر Scroll Bar عند الحاجة ضعه بداخل JScrollPane.

لا تقلق ستفهم كل شيء لاحقاً من الأمثلة.


بنا - الكلاس JSplitPane

public class JSplitPane
extends JComponent
implements Accessible
	

كونستركتورات الكلاس JSplitPane

الجدول التالي يحتوي على أهم الكونستركتورات الموجودة في الكلاس JSplitPane.

الكونستركتور مع تعريفه
public JSplitPane() ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض.

ملاحظة: إذا لم تضع أي شيء في الأقسام, سيقوم بوضع زر واحد في كل قسم.
public JSplitPane(int orientation) ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض أو الطول.
مكان الباراميتر orientation نضع إحدى الثوابت الموجودة في الكلاس JSplitPane المخصصة لتحديد طريقة تقسيم الـ Frame.

الثوابت التي يسمح باستخدامها هي:
  • JSplitPane.VERTICAL_SPLIT يقسم الـ Frame بالطول.

  • JSplitPane.HORIZONTAL_SPLIT يقسم الـ Frame بالعرض.


إفتراضياً, الـ Split Pane يستخدم الثابت JSplitPane.HORIZONTAL.

يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك.

ملاحظة: إذا لم تضع أي شيء في الأقسام, سيقوم بوضع زر واحد في كل قسم.
public JSplitPane(int orientation, Component leftComponent, Component rightComponent) ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض أو الطول مع تحديد محتوى كل قسم.

  • مكان الباراميتر orientation نضع إحدى الثوابت الموجودة في الكلاس JSplitPane المخصصة لتحديد طريقة تقسيم الـ Frame.

  • مكان الباراميتر leftComponent نضع الشيء الذي نريده أن يظهر في القسم الأيسر أو الأعلى.

  • مكان الباراميتر rightComponent نضع الشيء الذي نريده أن يظهر في القسم الأيمن أو الأسفل.


يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك.
public JSplitPane(int orientation, boolean continuousLayout, Component leftComponent, Component rightComponent) ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض أو الطول مع تحديد محتوى كل قسم, بالإضافة إلى تحديد إذا كان سيتم رسم الـ Frame مباشرةً عند تحريك الـ Splitter.

  • مكان الباراميتر orientation نضع إحدى الثوابت الموجودة في الكلاس JSplitPane المخصصة لتحديد طريقة تقسيم الـ Frame.

  • مكان الباراميتر continuousLayout نضع true حتى يتم رسم الـ Frame مباشرةً عند تحريك الـ Splitter, بالتالي لن يظهر خط أسود عند تحريكه.

  • مكان الباراميتر leftComponent نضع الشيء الذي نريده أن يظهر في القسم الأيسر أو الأعلى.

  • مكان الباراميتر rightComponent نضع الشيء الذي نريده أن يظهر في القسم الأيمن أو الأسفل.


يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك.

دوال الكلاس JSplitPane

الجدول التالي يحتوي على أهم الدوال الموجودة في الكلاس JSplitPane.

الدالة مع تعريفه
public void setOrientation(int orientation) تستخدم لتحديد ما إذا كان سيتم تقسيم الـ Frame أفقياً أم عامودياً.
مكان الباراميتر orientation نضع إحدى الثوابت الموجودة في الكلاس JSplitPane المخصصة لتحديد طريقة تقسيم الـ Frame.

الثوابت التي يسمح باستخدامها هي:
  • JSplitPane.VERTICAL_SPLIT يقسم الـ Frame بالطول.

  • JSplitPane.HORIZONTAL_SPLIT يقسم الـ Frame بالعرض.


إفتراضياً, الـ Split Pane يستخدم الثابت JSplitPane.HORIZONTAL.

يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك.
public void setContinuousLayout(boolean continuousLayout) تستخدم لتحديد إذا كان سيتم رسم الـ Frame مباشرةً عند تحريك الـ Splitter أم لا.
بمعنى آخر, لتحديد إذا كان سيتم تحديث الـ Frame لحظة بلحظة أثناء تحريك الـ Splitter.
مكان الباراميتر continuousLayout نضع true إذا أردنا أن يتم رسم الـ Frame مباشرةً عند تحريك الـ Splitter, بالتالي لن يظهر خط أسود عند تحريكه. و نضع false إذا لم نرد ذلك.
public void setDividerLocation(int location) تستخدم لتحديد موقع الـ Splitter في الـ Frame.
مكان الباراميتر location نضع عدد صحيح يحدد موقع الـ Splitter الأولي في الـ Frame.
public void setDividerSize(int size) تستخدم لتحديد موقع الـ Splitter في الـ Frame.
مكان الباراميتر location نضع عدد صحيح يحدد موقع الـ Splitter الأولي في الـ Frame.
public void setOneTouchExpandable(boolean isOneTouchExpandable) تستخدم لإضافة سهمين صغيرين على الـ Splitter يستخدمان لتحريكه بسرعة في إتجاه محدد.
مكان الباراميتر isOneTouchExpandable نضع true إذا أردنا إظهار السهمين. و نضع false إذا لم نرد ذلك.
public void setLeftComponent(Component comp) تستخدم لتحديد الشيء الذي سيتم وضعه في يسار ( أو أعلى ) الـ Splitter.
مكان الباراميتر comp نضع أي شيء نريد وضعه في ذلك المكان.
public void setRightComponent(Component comp) تستخدم لتحديد الشيء الذي سيتم وضعه في يمين ( أو أسفل ) الـ Splitter.
مكان الباراميتر comp نضع أي شيء نريد وضعه في ذلك المكان.
public void setTopComponent(Component comp) تستخدم لتحديد الشيء الذي سيتم وضعه في أعلى ( أو يسار ) الـ Splitter.
مكان الباراميتر comp نضع أي شيء نريد وضعه في ذلك المكان.
public void setBottomComponent(Component comp) تستخدم لتحديد الشيء الذي سيتم وضعه في أسفل ( أو يمين ) الـ Splitter.
مكان الباراميتر comp نضع أي شيء نريد وضعه في ذلك المكان.

 طريقة إضافة JSplitPane في الـ JFrame

المثال التالي يعلمك طريقة إضافة الـ Splitter في الـ Frame لتقسيمها إلى قسمين.
ملاحظة: إفتراضياً, إذا لم تحدد محتوى أقسام الـ Frame ستجد أنه يضع زر واحد في كل قسم.


مثال يعلمك طريقة إضافة الـ Splitter في الـ Frame لتقسيمها إلى قسمين.

Main.java
					import javax.swing.JFrame;
					import javax.swing.JSplitPane;

					public class Main {

					public static void main(String[] args) {

					JFrame frame = new JFrame("JSplitPane demo");           // أي قمنا بإنشاء نافذة مع وضع عنوان لها JFrame هنا أنشأنا كائن من الكلاس
					frame.setSize(400, 200);                                // هنا قمنا بتحديد حجم النافذة. عرضها 400 و طولها 200
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج

					JSplitPane splitPane = new JSplitPane();                // Split Pane أي قمنا بإنشاء JSplitPane هنا أنشأنا كائن من الكلاس
					splitPane.setDividerLocation(184);                      // splitPane في الـ Splitter هنا قمنا بتحديد موقع الـ

					frame.add(splitPane);                                   // لتقسيمها إلى قسمين أساسيين frame في الـ splitPane هنا أضفنا الـ
					frame.setVisible(true);                                 // هنا جعلنا النافذة مرئية

					}

					}
				  

ستظهر لك النافذة التالية عند التشغيل.

حاول تحريك الـ Splitter ثم لاحظ أنه يظهر خط أسود أثناء تحريكه.

طريقة إضافة jsplitpane في ال JFrame في جافا

 طريقة تحديد حجم الـ JSplitPane و حل مشكلة اللون الأسود التي تظهر عند تحريكه

المثال التالي يعلمك طريقة تحديد حجم الـ Splitter, إضافة أسهم عليه لجعل المستخدم قادراً على تحريكه بسرعة, بالإضافة إلى إخفاء اللون الأسود الذي يظهر عند تحريكه.


مثال طريقة تحديد حجم الـ JSplitPane و حل مشكلة اللون الأسود التي تظهر عند تحريكه

Main.java
					import javax.swing.JFrame;
					import javax.swing.JSplitPane;

					public class Main {

					public static void main(String[] args) {

					JFrame frame = new JFrame("JSplitPane demo");           // أي قمنا بإنشاء نافذة مع وضع عنوان لها JFrame هنا أنشأنا كائن من الكلاس
					frame.setSize(400, 200);                                // هنا قمنا بتحديد حجم النافذة. عرضها 400 و طولها 200
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج

					JSplitPane splitPane = new JSplitPane();                // Split Pane أي قمنا بإنشاء JSplitPane هنا أنشأنا كائن من الكلاس
					splitPane.setDividerLocation(184);                      // splitPane في الـ Splitter هنا قمنا بتحديد موقع الـ
					splitPane.setDividerSize(9);                            // 9px و جعلناه يساوي Splitter هنا قمنا بتحديد حجم الـ
					splitPane.setOneTouchExpandable(true);                  // Splitter هنا قمنا بإضافة أسهم التحريك السريع على الـ
					splitPane.setContinuousLayout(true);                    // Splitter هنا قمنا بإخفاء اللون الأسود الذي يظهر عند تحريك الـ

					frame.add(splitPane);                                   // لتقسيمها إلى قسمين أساسيين frame في الـ splitPane هنا أضفنا الـ
					frame.setVisible(true);                                 // هنا جعلنا النافذة مرئية

					}

					}
				  

ستظهر لك النافذة التالية عند التشغيل.

لاحظ أنه لن يظهر خط أسود عند تحريك الـ Splitter.

طريقة تحديد حجم ال splitter و حل مشكلة اللون الأسود التي تظهر عند تحريكه في جافا

 طريقة إظهار الـ JSplitPane بشكل أفقي لتقسيم الـ JFrame بالطول

المثال التالي يعلمك طريقة تقسيم الـ Frame إلى قسمين بالطول, أي إظهار الـ Splitter بشكل أفقي.


مثال يعلمك طريقة تقسيم الـ Frame إلى قسمين بالطول, أي إظهار الـ Splitter بشكل أفقي.

Main.java
					import javax.swing.JFrame;
					import javax.swing.JSplitPane;

					public class Main {

					public static void main(String[] args) {

					JFrame frame = new JFrame("JSplitPane demo");           // أي قمنا بإنشاء نافذة مع وضع عنوان لها JFrame هنا أنشأنا كائن من الكلاس
					frame.setSize(300, 300);                                // هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 300
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج

					JSplitPane splitPane = new JSplitPane();                // Split Pane أي قمنا بإنشاء JSplitPane هنا أنشأنا كائن من الكلاس
					splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);    // يظهر بشكل أفقي splitter هنا جعلنا الـ
					splitPane.setDividerLocation(130);                      // splitPane في الـ Splitter هنا قمنا بتحديد موقع الـ
					splitPane.setDividerSize(9);                            // 9px و جعلناه يساوي Splitter هنا قمنا بتحديد حجم الـ
					splitPane.setOneTouchExpandable(true);                  // Splitter هنا قمنا بإضافة أسهم التحريك السريع على الـ
					splitPane.setContinuousLayout(true);                    // Splitter هنا قمنا بإخفاء اللون الأسود الذي يظهر عند تحريك الـ

					frame.add(splitPane);                                   // لتقسيمها إلى قسمين أساسيين frame في الـ splitPane هنا أضفنا الـ
					frame.setVisible(true);                                 // هنا جعلنا النافذة مرئية

					}

					}
				  

ستظهر لك النافذة التالية عند التشغيل.

طريقة إظهار ال splitter بشكل أفقي في جافا

 طريقة وضع إثنين JSplitPane في الـ JFrame

المثال التالي يعلمك طريقة وضع إثنين Splitter في الـ Frame.


مثال يشرح طريقة وضع إثنين Splitter في الـ Frame.

Main.java
					import javax.swing.JFrame;
					import javax.swing.JSplitPane;

					public class Main {

					public static void main(String[] args) {

					// و تحديد بعد خصائصها Frame هنا قمنا بتعريف الـ
					JFrame frame = new JFrame("JSplitPane demo");
					frame.setSize(300, 300);
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

					// الأول الذي سنستخدمه لتقسيم الشاشة إلى قسمين بالطول Split Pane هنا قمنا بتعريف الـ
					JSplitPane sp1 = new JSplitPane();
					sp1.setOrientation(JSplitPane.VERTICAL_SPLIT);
					sp1.setDividerLocation(200);
					sp1.setContinuousLayout(true);

					// الأول إلى قسمين بالطول Split Pane الثاني الذي سنستخدمه لتقسيم القسم الأعلى في الـ Split Pane هنا قمنا بتعريف الـ
					JSplitPane sp2 = new JSplitPane();=
					sp2.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
					sp2.setDividerLocation(130);
					sp2.setContinuousLayout(true);

					// sp1 في القسم الأعلى من الـ sp2 هنا وضعنا الـ
					sp1.setTopComponent(sp2);

					// و الذي سيجعلها تنقسم إلى ثلاثة أقسام Frame في الـ sp1 هنا وضعنا الـ
					frame.add(sp1);

					// Frame هنا قمنا بإظهار الـ
					frame.setVisible(true);

					}

					}
				  

ستظهر لك النافذة التالية عند التشغيل.

طريقة وضع إثنين splitter في ال frame في جافا

كيفية  الإستفادة من الـ JSplitPane في التطبيقات الفعلية

المثال التالي يعلمك طريقة وضع أي محتوى تريده في الـ Split Pane و إضافة Scroll Bar للأقسام أيضاً.

في البداية قمنا بإنشاء مجلد خاص لوضع الصور التي نريد عرضها في البرنامج كما في الصورة التالية.

⇓ تحميل مجلد الصور

بعدها قمنا بإنشاء كائن من الكلاس JSplitPane إسمه splitPane لتقسيم الـ Frame إلى قسمين.
وضعنا JScrollPane في القسم الأيمن و القسم الأيسر من الـ splitPane حتى يظهروا Scroll Bar في حال كان المحتوى الموضوع فيهما يحتاج إلى مساحة أكبر حتى يظهر.
في الـ JScrollPane الأيمن وضعنا JLabel و الذي سنضع فيه الصورة.
في الـ JScrollPane الأيسر وضعنا JList و التي سنضع فيها جميع أسماء الصور الموجودة في المجلد images.
في الأخير قلنا أن أي صورة يتم النقر على إسمها سيتم عرض محتواها كأيقونة للـ JLabel.


مثال طريقة وضع أي محتوى تريده في الـ Split Pane و إضافة Scroll Bar للأقسام أيضاً.

Main.java
					import javax.swing.JFrame;
					import javax.swing.JLabel;
					import javax.swing.JList;
					import javax.swing.DefaultListModel;
					import javax.swing.ImageIcon;
					import javax.swing.JScrollPane;
					import javax.swing.JSplitPane;
					import javax.swing.JOptionPane;
					import javax.swing.ListSelectionModel;
					import javax.swing.event.ListSelectionEvent;
					import javax.swing.event.ListSelectionListener;
					import java.io.File;

					public class Main {

					static JFrame frame = new JFrame("JSplitPane demo");        // Frame هنا قمنا بتعريف الـ
					static JLabel picture = new JLabel();                       // Frame لعرض الصور في القسم الأيمن من الـ Label سنستخدم هذا الـ
					static DefaultListModel model = new DefaultListModel();     // List لتخزين محتوى الـ model سنستخدم هذه الـ
					static JList list = new JList(model);                       // Frame التي سنضعها في القسم الأيسر من الـ List هنا قمنا بتعريف الـ

					public static void main(String[] args) {

					frame.setSize(500, 320);                                // هنا قمنا بتحديد حجم النافذة. عرضها 500 و طولها 320
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // هنا جعلنا زر الخروج من النافذة يغلق البرنامج

					// عند الحاجة Scroll Bar حتى يظهروا بداخل Scroll Pane بداخل picture و الـ list هنا وضعنا كل الـ
					JScrollPane listScrollPane = new JScrollPane(list);
					JScrollPane pictureScrollPane = new JScrollPane(picture);

					// في القسم الأيمن pictureScrollPane في القسم الأيسر و الـ listScrollPane و وضعنا في الـ Split Pane هنا قمنا بتعريف الـ
					JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listScrollPane, pictureScrollPane);                // Split Pane أي قمنا بإنشاء JSplitPane هنا أنشأنا كائن من الكلاس

					splitPane.setDividerLocation(150);            // splitPane في الـ Splitter هنا قمنا بتحديد موقع الـ
					splitPane.setOneTouchExpandable(true);        // Splitter هنا قمنا بإضافة أسهم التحريك السريع على الـ
					splitPane.setContinuousLayout(true);          // Splitter هنا قمنا بإخفاء اللون الأسود الذي يظهر عند تحريك الـ

					// model و وضعناها في الـ images هنا قمنا بجلب جميع أسماء الصور التي وضعناها في المجلد
					try {
					File rootFolder = new File("src/images");
					String[] paths = rootFolder.list();
					for (String path: paths)
					model.addElement(path);
					}
					catch (Exception e) {
					JOptionPane.showMessageDialog(null, "No Image found!", "Error", JOptionPane.ERROR_MESSAGE);
					}

					// هنا جعلنا المستخدم قادر على تحديد صورة واحدة من القائمة في كل مرة و جعلنا أول صورة محددة إفتراضياً
					list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
					list.setSelectedIndex(0);

					// list و عرضنا الصورة المحددة إفتراضياَ في الـ pictureScrollPane هنا جعلنا الصور تظهر في منتصف الـ
					picture.setHorizontalAlignment(JLabel.CENTER);
					picture.setIcon(new ImageIcon(Main.class.getResource("../images/"+list.getSelectedValue())));

					// هنا قلنا أنه في كل مرة يقوم المستخدم بالنقر إسم الصورة, سيتم إظهارها له
					list.addListSelectionListener(new ListSelectionListener() {
					@Override
					public void valueChanged(ListSelectionEvent e)
					{
					picture.setIcon(new ImageIcon(Main.class.getResource("../images/"+list.getSelectedValue())));
					}
					});

					frame.add(splitPane);         // لتقسيمها إلى قسمين أساسيين frame في الـ splitPane هنا أضفنا الـ
					frame.setVisible(true);       // هنا جعلنا النافذة مرئية

					}

					}
				  

ستظهر لك النافذة التالية عند التشغيل.

طريقة وضع قائمة JList و صورة ImageIcon في ال JSplitPane في جافا

دورة تعلم الجافا Swing