Swing - الكلاس JTabbedPane

 Swing - الكلاس JTabbedPane

الكلاس JTabbedPane يستخدم لإضافة (Tabbed Pane) في واجهة المستخدم.
الـ Tabbed Pane تستخدم لوضع عدة Panels في مكان واحد مع إمكانية إظهار Panel واحد منهم في وقت واحد.

كل Panel توضع بداخل الـ Tabbed Pane تملك Tab خاص فيها.
عندما يقوم المستخدم بالنقر على الـ Tab فإنها تظهر الـ Panel التي بداخلها.

إفتراضياً, الـ Tabbed Pane يظهر حدود عند إضافته في النافذة. و يمكنك وضع العدد الذي تريده من الـ Panels بداخله.


بنا - الكلاس JTabbedPane

public class JTabbedPane
extends JComponent
implements Serializable, Accessible, SwingConstan
	

طريقة التعامل مع - الكلاس JTabbedPane

لإضافة Panel في الـ Tabbed Pane نستخدم الدالة addTab() أو الدالة insertTab().

كل Panel تضيفه في الـ Tabbed Pane يتم إعطائه رقم Index بشكل تلقائي.
الـ Panel الأول يحمل الـ Index رقم 0.
الـ Panel الثاني يحمل الـ Index رقم 1 إلخ..

لإظهار Panel محدد من الـ Panels الموجودين إستخدام الدالة setSelectedComponent() أو الدالة setSelectedIndex().


ملاحظة الكلاس JTabbedPane

محتوى الـ Tab ليس بالضرورة أن يكون Panel.
يمكن أن يكون أي شيء مثل Label, Button, Text Box إلخ..
لكنك على الأغلب ستجعل كل Tab يظهر Panel و تضع المحتوى الذي تريده بداخلها.

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

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

الكونستركتور مع تعريفه
public JTabbedPane() ينشئ كائن من الكلاس JTabbedPane يمثل Tabbed Pane فارغ يظهر الـ Tabs التي نضيفها فيه في الأعلى.
سبب ظهور الـ Tabs في الأعلى هو أن الـ Tabbed Pane يستخدم إفتراضياً الثابت JTabbedPane.TOP لتحديد مكان ظهورهم.
public JTabbedPane(int tabPlacement) ينشئ كائن من الكلاس JTabbedPane يمثل Tabbed Pane فارغ يظهر الـ Tabs التي نضيفها فيه في المكان الذي نريده.

مكان الباراميتر tabPlacement نضع إحدى الثوابت التالية:
  • JTabbedPane.TOP: يجعل الـ Tabs يظهرون في أعلا الـ Tabbed Pane.

  • JTabbedPane.BOTTOM: يجعل الـ Tabs يظهرون في أسفل الـ Tabbed Pane.

  • JTabbedPane.RIGHT: يجعل الـ Tabs يظهرون في يمين الـ Tabbed Pane.

  • JTabbedPane.LEFT: يجعل الـ Tabs يظهرون في يسار الـ Tabbed Pane.


يرمي الإستثناء IllegalArgumentException في حال لم يتم تحديد الـ tabPlacement
بواسطة الثوابت المخصصة لذلك. public JTabbedPane(int tabPlacement, int tabLayoutPolicy) ينشئ كائن من الكلاس JTabbedPane يمثل Tabbed Pane فارغ يظهر الـ Tabs التي نضيفها فيه في المكان الذي نريده.
كما أنه يحدد إذا كان سيتم إضافة Scroll Bar في حال كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم. أو لتحديد إذا كان سيضعهم فوق بعضهم كما يفعل إفتراضياً,

مكان الباراميتر tabPlacement نضع إحدى الثوابت التالية:
  • JTabbedPane.TOP: يجعل الـ Tabs يظهرون في أعلا الـ Tabbed Pane.

  • JTabbedPane.BOTTOM: يجعل الـ Tabs يظهرون في أسفل الـ Tabbed Pane.

  • JTabbedPane.RIGHT: يجعل الـ Tabs يظهرون في يمين الـ Tabbed Pane.

  • JTabbedPane.LEFT: يجعل الـ Tabs يظهرون في يسار الـ Tabbed Pane.



مكان الباراميتر tabLayoutPolicy نضع إحدى الثوابت التالية:
  • JTabbedPane.WRAP_TAB_LAYOUT: يجعل الـ Tabs يظهرون فوق بعضهم البعض في حال كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.

  • JTabbedPane.SCROLL_TAB_LAYOUT: يضيف Scroll Bar خاص للإنتقال بين الـ Tabs في حال كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.


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

 طريقة إنشاء JTabbedPane و إضافة Panels بداخله و إضافته في النافذة

المثال التالي يعلمك طريقة إنشاء كائن من الكلاس JTabbedPane و إضافة Panels بداخله. ثم إضافته في النافذة.


مثال يشرح طريقة إنشاء كائن من الكلاس JTabbedPane و إضافة Panels بداخله. ثم إضافته في النافذة.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import java.awt.Color;

                    public class Main {

                    public static void main(String[] args) {

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

                    // Panels هنا قمنا بتعريف ثلاثة
                    JPanel panel_1 = new JPanel();
                    JPanel panel_2 = new JPanel();
                    JPanel panel_3 = new JPanel();

                    // منهم Panel هنا قمنا بإعطاء لون خلفية لكل
                    panel_1.setBackground(Color.white);
                    panel_2.setBackground(Color.cyan);
                    panel_3.setBackground(Color.yellow);

                    // Frame مع تحديد موقعه و حجمه في الـ Tabbed Pane هنا قمنا بتعريف
                    JTabbedPane tabbedPane = new JTabbedPane();
                    tabbedPane.setBounds(50, 30, 200, 200);

                    // منهم فيه Panel مع تحديد عنوان كل Tabbed Pane في الـ Panels هنا وضعنا الثلاثة
                    tabbedPane.addTab("Tab 1", panel_1);
                    tabbedPane.addTab("Tab 2", panel_2);
                    tabbedPane.addTab("Tab 3", panel_3);

                    // Frame في الـ Tabbed Pane هنا أضفنا الـ
                    frame.add(tabbedPane);

                    // مرئية Frame هنا جعلنا الـ
                    frame.setVisible(true);

                    }

                    }
                  

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

طريقة إنشاء JTabbedPane و إضافة Panels بداخله. ثم إضافته في النافذة

 إظهار الـ Tabs فوق بعضهم

المثال التالي يوضح طريقة ظهور الـ Tabs في حال لم يتم تغيير الـ Tab Layout Policy و كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.


مثال طريقة ظهور الـ Tabs في حال لم يتم تغيير الـ Tab Layout Policy و كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import java.awt.Color;

                    public class Main {

                    public static void main(String[] args) {

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

                    // Panels هنا قمنا بتعريف خمسة
                    JPanel panel_1 = new JPanel();
                    JPanel panel_2 = new JPanel();
                    JPanel panel_3 = new JPanel();
                    JPanel panel_4 = new JPanel();
                    JPanel panel_5 = new JPanel();

                    // منهم Panel هنا قمنا بإعطاء لون خلفية لكل
                    panel_1.setBackground(Color.white);
                    panel_2.setBackground(Color.cyan);
                    panel_3.setBackground(Color.yellow);
                    panel_4.setBackground(Color.green);
                    panel_5.setBackground(Color.red);

                    // Frame مع تحديد موقعه و حجمه في الـ Tabbed Pane هنا قمنا بتعريف
                    JTabbedPane tabbedPane = new JTabbedPane();
                    tabbedPane.setBounds(50, 30, 200, 200);

                    // منهم فيه Panel مع تحديد عنوان كل Tabbed Pane في الـ Panels هنا وضعنا جميع الـ
                    tabbedPane.addTab("Tab 1", panel_1);
                    tabbedPane.addTab("Tab 2", panel_2);
                    tabbedPane.addTab("Tab 3", panel_3);
                    tabbedPane.addTab("Tab 4", panel_4);
                    tabbedPane.addTab("Tab 5", panel_5);

                    // Frame في الـ Tabbed Pane هنا أضفنا الـ
                    frame.add(tabbedPane);

                    // مرئية Frame هنا جعلنا الـ
                    frame.setVisible(true);

                    }

                    }
                  

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

طريقة ظهور ال tabs في ال JTabbedPane في حال إستخدام ال JTabbedPane.WRAP_TAB_LAYOUT

 طريقة إظهار Scroll Bar في حال كانت مساحة الـ JTabbedPane غير كافية لإظهار جميع الـ Tabs وراء بعضهم

المثال التالي يعلمك طريقة إظهار Scroll Bar في حال كانت مساحة الـ JTabbedPane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.


مثال يعلمك طريقة إظهار Scroll Bar في حال كانت مساحة الـ JTabbedPane غير كافية لإظهار جميع الـ Tabs وراء بعضهم

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import java.awt.Color;

                    public class Main {

                    public static void main(String[] args) {

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

                    // Panels هنا قمنا بتعريف خمسة
                    JPanel panel_1 = new JPanel();
                    JPanel panel_2 = new JPanel();
                    JPanel panel_3 = new JPanel();
                    JPanel panel_4 = new JPanel();
                    JPanel panel_5 = new JPanel();

                    // منهم Panel هنا قمنا بإعطاء لون خلفية لكل
                    panel_1.setBackground(Color.white);
                    panel_2.setBackground(Color.cyan);
                    panel_3.setBackground(Color.yellow);
                    panel_4.setBackground(Color.green);
                    panel_5.setBackground(Color.red);

                    // عند الحاجة Scroll Bar و جعله يضيف Tabs و تحديد مكان ظهور الـ Frame مع تحديد موقعه و حجمه في الـ Tabbed Pane هنا قمنا بتعريف
                    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
                    tabbedPane.setBounds(50, 30, 200, 200);

                    // منهم فيه Panel مع تحديد عنوان كل Tabbed Pane في الـ Panels هنا وضعنا جميع الـ
                    tabbedPane.addTab("Tab 1", panel_1);
                    tabbedPane.addTab("Tab 2", panel_2);
                    tabbedPane.addTab("Tab 3", panel_3);
                    tabbedPane.addTab("Tab 4", panel_4);
                    tabbedPane.addTab("Tab 5", panel_5);

                    // Frame في الـ Tabbed Pane هنا أضفنا الـ
                    frame.add(tabbedPane);

                    // مرئية Frame هنا جعلنا الـ
                    frame.setVisible(true);

                    }

                    }
                  

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

طريقة إظهار Scroll Bar في حال كانت مساحة ال Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.

 طريقة إظهار الـ Tabs في أسفل الـ JTabbedPane

المثال التالي يعلمك طريقة إظهار الـ Tabs في أسفل الـ Tabbed Pane و إضافة Scroll Bar في حال كانت مساحة الـ Tabbed Pane غير كافية لإظهار جميع الـ Tabs وراء بعضهم.


مثال طريقة إظهار الـ Tabs في أسفل الـ Tabbed Pane  .

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import java.awt.Color;

                    public class Main {

                    public static void main(String[] args) {

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

                    // Panels هنا قمنا بتعريف خمسة
                    JPanel panel_1 = new JPanel();
                    JPanel panel_2 = new JPanel();
                    JPanel panel_3 = new JPanel();
                    JPanel panel_4 = new JPanel();
                    JPanel panel_5 = new JPanel();

                    // منهم Panel هنا قمنا بإعطاء لون خلفية لكل
                    panel_1.setBackground(Color.white);
                    panel_2.setBackground(Color.cyan);
                    panel_3.setBackground(Color.yellow);
                    panel_4.setBackground(Color.green);
                    panel_5.setBackground(Color.red);

                    // عند الحاجة Scroll Bar و جعله يضيف Tabs و تحديد مكان ظهور الـ Frame مع تحديد موقعه و حجمه في الـ Tabbed Pane هنا قمنا بتعريف
                    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
                    tabbedPane.setBounds(50, 30, 200, 200);

                    // منهم فيه Panel مع تحديد عنوان كل Tabbed Pane في الـ Panels هنا وضعنا جميع الـ
                    tabbedPane.addTab("Tab 1", panel_1);
                    tabbedPane.addTab("Tab 2", panel_2);
                    tabbedPane.addTab("Tab 3", panel_3);
                    tabbedPane.addTab("Tab 4", panel_4);
                    tabbedPane.addTab("Tab 5", panel_5);

                    // Frame في الـ Tabbed Pane هنا أضفنا الـ
                    frame.add(tabbedPane);

                    // مرئية Frame هنا جعلنا الـ
                    frame.setVisible(true);

                    }

                    }
                  

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

طريقة إظهار ال tabs أسفل ال Tabbed Pane

 طريقة إضافة زر إغلاق لكل Tab في الـ JTabbedPane

المثال التالي يعلمك طريقة إضافة زر إغلاق لكل Tab يتم إضافتها في الـ Tabbed Pane.

سنقوم ببناء كلاس خاص لإضافة زر إغلاق لكل Tab موجود بداخل الـ Tabbed Pane.


مثال يشرح لك يعلمك طريقة إضافة زر إغلاق لكل Tab يتم إضافتها في الـ Tabbed Pane.

SpecialTab.java
                    import java.awt.Color;
                    import java.awt.Dimension;
                    import java.awt.FlowLayout;
                    import java.awt.event.ActionEvent;
                    import java.awt.event.ActionListener;
                    import javax.swing.BorderFactory;
                    import javax.swing.JButton;
                    import javax.swing.JLabel;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import javax.swing.plaf.basic.BasicButtonUI;

                    public class SpecialTab extends JPanel {

                    private final JTabbedPane tabbedPane;

                    public SpecialTab(final JTabbedPane tabbedPane) {

                    // تترب من اليسار لليمين و أزلنا أي هوامش لا حاجة لها Tab هنا جعلنا الأشياء التي ستظهر في الـ
                    super(new FlowLayout(FlowLayout.LEFT, 0, 0));

                    // فارغاً tabbedPane سيتم رمي إستثناء في حال كان الـ
                    if (tabbedPane == null) {
                    throw new NullPointerException("TabbedPane is null");
                    }
                    this.tabbedPane = tabbedPane;

                    // مفتوح Tab هنا قمنا بتحسين لون الخلفية الذي يظهر على الـ
                    setOpaque(false);

                    // label و تحويله إلى Panel هنا سيتم قراءة عنوان الـ
                    JLabel label = new JLabel() {
                    @Override
                    public String getText() {
                    int i = tabbedPane.indexOfTabComponent(SpecialTab.this);
                    if (i != -1)
                    return tabbedPane.getTitleAt(i);
                    return null;
                    }
                    };

                    // Tab في الـ label بعدها سيتم وضع الـ
                    add(label);

                    // 5px بعدها سيتم إزالة أي حدود موضوعة له و إضافة هامش بنسبة
                    label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));

                    // بعدها سيتم تعريف زر الخروج الذي سيظهر بجانب العنوان
                    JButton button = new CloseButton();
                    add(button);

                    // هنا قمنا بإضافة بعض الهامش ناحية اليسار قبل زر الخروج
                    setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
                    }


                    private class CloseButton extends JButton implements ActionListener {

                    public CloseButton() {
                    int size = 15;
                    setPreferredSize(new Dimension(size, size));
                    setText("×");
                    setForeground(Color.white);
                    setToolTipText("close this tab");

                    setBackground(new Color(254, 46, 46));
                    setContentAreaFilled(true);

                    setFocusable(false);
                    setBorder(BorderFactory.createEtchedBorder());
                    setBorderPainted(true);

                    setUI(new BasicButtonUI());

                    addActionListener(this);
                    }

                    @Override
                    public void actionPerformed(ActionEvent e) {
                    int i = tabbedPane.indexOfTabComponent(SpecialTab.this);
                    if (i != -1)
                    tabbedPane.remove(i);
                    }

                    @Override
                    public void updateUI() { }

                    }

                    }
                  

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JPanel;
                    import javax.swing.JTabbedPane;
                    import java.awt.Color;

                    public class Main {

                    public static void main(String[] args) {

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

                    // Panels هنا قمنا بتعريف خمسة
                    JPanel panel_1 = new JPanel();
                    JPanel panel_2 = new JPanel();
                    JPanel panel_3 = new JPanel();
                    JPanel panel_4 = new JPanel();
                    JPanel panel_5 = new JPanel();

                    // منهم Panel هنا قمنا بإعطاء لون خلفية لكل
                    panel_1.setBackground(Color.white);
                    panel_2.setBackground(Color.cyan);
                    panel_3.setBackground(Color.yellow);
                    panel_4.setBackground(Color.green);
                    panel_5.setBackground(Color.red);

                    // عند الحاجة Scroll Bar و جعله يضيف Tabs و تحديد مكان ظهور الـ Frame مع تحديد موقعه و حجمه في الـ Tabbed Pane هنا قمنا بتعريف
                    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
                    tabbedPane.setBounds(50, 30, 300, 200);

                    // منهم فيه Panel مع تحديد عنوان كل Tabbed Pane في الـ Panels هنا وضعنا جميع الـ
                    tabbedPane.addTab("Tab 1", panel_1);
                    tabbedPane.addTab("Tab 2", panel_2);
                    tabbedPane.addTab("Tab 3", panel_3);
                    tabbedPane.addTab("Tab 4", panel_4);
                    tabbedPane.addTab("Tab 5", panel_5);

                    // حتى يتم إضافة زر للخروج لكل واحد منهم SpecialTab إلى tabbedPane الموجودة بداخل الـ Tabs هنا أنشأنا حلقة تقوم بتحويل جميع الـ
                    for(int i=0; i<tabbedPane.getTabCount(); i++)
                    tabbedPane.setTabComponentAt(i, new SpecialTab(tabbedPane));

                    // Frame في الـ Tabbed Pane هنا أضفنا الـ
                    frame.add(tabbedPane);

                    // مرئية Frame هنا جعلنا الـ
                    frame.setVisible(true);

                    }

                    }
                  

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

طريقة إضافة زر إغلاق لكل tab في جافا

  تعلم Java Swing 

أفضل كورس لتعلم Java swing من الصفر الى الاحتراف .