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.الثوابت التي يسمح باستخدامها هي:
إفتراضياً, الـ Split Pane يستخدم الثابت JSplitPane.HORIZONTAL .يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك. ملاحظة: إذا لم تضع أي شيء في الأقسام, سيقوم بوضع زر واحد في كل قسم. |
|
public JSplitPane(int orientation, Component leftComponent, Component rightComponent)
ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض أو الطول مع تحديد محتوى كل قسم.
يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك. |
|
public JSplitPane(int orientation, boolean continuousLayout, Component leftComponent, Component rightComponent)
ينشئ كائن من الكلاس JSplitPane يضيف Splitter في الـ Frame, فيقسمها إلى قسمين بالعرض أو الطول مع تحديد محتوى كل قسم, بالإضافة إلى تحديد إذا كان سيتم رسم الـ Frame مباشرةً عند تحريك الـ Splitter.
يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ Orientation بواسطة الثوابت المخصصة لذلك. |
دوال الكلاس JSplitPane
الجدول التالي يحتوي على أهم الدوال الموجودة في الكلاس JSplitPane
.
الدالة مع تعريفه | |
---|---|
public void setOrientation(int orientation)
تستخدم لتحديد ما إذا كان سيتم تقسيم الـ Frame أفقياً أم عامودياً.مكان الباراميتر orientation نضع إحدى الثوابت الموجودة في الكلاس JSplitPane المخصصة لتحديد طريقة تقسيم الـ 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 لتقسيمها إلى قسمين.
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
و حل مشكلة اللون الأسود التي تظهر عند تحريكه
المثال التالي يعلمك طريقة تحديد حجم الـ Splitter, إضافة أسهم عليه لجعل المستخدم قادراً على تحريكه بسرعة, بالإضافة إلى إخفاء اللون الأسود الذي يظهر عند تحريكه.
مثال طريقة تحديد حجم الـ JSplitPane
و حل مشكلة اللون الأسود التي تظهر عند تحريكه
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.
طريقة إظهار الـ JSplitPane
بشكل أفقي لتقسيم الـ JFrame
بالطول
المثال التالي يعلمك طريقة تقسيم الـ Frame إلى قسمين بالطول, أي إظهار الـ Splitter بشكل أفقي.
مثال يعلمك طريقة تقسيم الـ Frame إلى قسمين بالطول, أي إظهار الـ Splitter بشكل أفقي.
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); // هنا جعلنا النافذة مرئية } }
•ستظهر لك النافذة التالية عند التشغيل.
طريقة وضع إثنين JSplitPane
في الـ JFrame
المثال التالي يعلمك طريقة وضع إثنين Splitter في الـ Frame.
مثال يشرح طريقة وضع إثنين Splitter في الـ Frame.
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); } }
•ستظهر لك النافذة التالية عند التشغيل.
كيفية الإستفادة من الـ JSplitPane
في التطبيقات الفعلية
المثال التالي يعلمك طريقة وضع أي محتوى تريده في الـ Split Pane و إضافة Scroll Bar للأقسام أيضاً.
في البداية قمنا بإنشاء مجلد خاص لوضع الصور التي نريد عرضها في البرنامج كما في الصورة التالية.
بعدها قمنا بإنشاء كائن من الكلاس JSplitPane
إسمه splitPane
لتقسيم الـ Frame إلى قسمين.
وضعنا JScrollPane
في القسم الأيمن و القسم الأيسر من الـ splitPane
حتى يظهروا Scroll Bar في حال كان المحتوى الموضوع فيهما يحتاج إلى مساحة أكبر حتى يظهر.
في الـ JScrollPane
الأيمن وضعنا JLabel
و الذي سنضع فيه الصورة.
في الـ JScrollPane
الأيسر وضعنا JList
و التي سنضع فيها جميع أسماء الصور الموجودة في المجلد images.
في الأخير قلنا أن أي صورة يتم النقر على إسمها سيتم عرض محتواها كأيقونة للـ JLabel.
مثال طريقة وضع أي محتوى تريده في الـ Split Pane و إضافة Scroll Bar للأقسام أيضاً.
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); // هنا جعلنا النافذة مرئية } }
•ستظهر لك النافذة التالية عند التشغيل.
دورة تعلم الجافا Swing