Esempio completo per gestire un pulsante di chiusura nelle linguette di un JTabbedPane:
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestFrame extends JFrame {
public TestFrame() {
super("Test Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
// Non cambia nulla di altro, se non la istanziazione
// di un CloseableTabbedPane piuttosto che un JTabbedPane
JTabbedPane tabbedPane = new CloseableTabbedPane();
// Normalissimi addTab()
tabbedPane.addTab("p1", new JLabel("page 1"));
tabbedPane.addTab("p2", new JLabel("page 2"));
tabbedPane.addTab("p3", new JLabel("page 3"));
tabbedPane.addTab("p4", new JLabel("page 4"));
getContentPane().add(tabbedPane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestFrame f = new TestFrame();
f.setVisible(true);
}
});
}
}
class CloseableTabbedPane extends JTabbedPane {
public CloseableTabbedPane() {
super();
}
public CloseableTabbedPane(int tabPlacement) {
super(tabPlacement);
}
public CloseableTabbedPane(int tabPlacement, int tabLayoutPolicy) {
super(tabPlacement, tabLayoutPolicy);
}
public void insertTab(String title, Icon icon, Component component, String tip, int index) {
super.insertTab(title, icon, component, tip, index);
setTabComponentAt(index, new TabPanel(this, title, icon));
}
// NOTA: in realtà per fare una gestione completa bisognerebbe
// fare l'override anche di svariati altri metodi es. setTitleAt(),
// setIconAt(), ecc... E modificare anche TabPanel per poter
// passare tali dati.
}
class TabPanel extends JPanel {
private JTabbedPane tabbedPane;
public TabPanel(JTabbedPane tp, String title, Icon icon) {
tabbedPane = tp;
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
setOpaque(false);
JLabel tabLabel = new JLabel(title);
tabLabel.setIcon(icon);
JButton tabCloseButton = new JButton("X");
tabCloseButton.setMargin(new Insets(0, 0, 0, 0));
add(tabLabel);
add(Box.createHorizontalStrut(4));
add(tabCloseButton);
tabCloseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int index = tabbedPane.indexOfTabComponent(TabPanel.this);
if (index != -1) {
tabbedPane.removeTabAt(index);
}
}
});
}
}