Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

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

المثال التالي يعلمك طريقة إضافة زر إغلاق لكل 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() { }
}
}
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);
}
}
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 في جافا