web-dev-qa-db-fra.com

Comment ajouter un bouton de fermeture à un onglet JTabbedPane?

Je travaille avec un JTabbedPane, je dois ajouter un bouton de fermeture dans les onglets pour fermer celui en cours.

J'ai cherché et si je comprends bien, je dois étendre de JPanel et ajouter le bouton de fermeture comme ils disent ici Mais, existe-t-il un moyen d'ajouter les boutons de fermeture étendant JTabbedPane ou y a-t-il un moyen plus facile de le faire il?

Merci d'avance, j'apprécie vraiment votre temps et votre aide.

27
Herman

Essentiellement, vous devrez fournir un "moteur de rendu" pour l'onglet. Jetez un œil à JTabbedPane.setTabComponentAt (...) pour plus d'informations.

L'idée de base est de fournir un composant qui sera présenté sur l'onglet.

Je crée généralement un JPanel, sur lequel j'ajoute un JLabel (pour le titre) et, selon ce que je veux afficher, une sorte de contrôle qui agit comme l'action de fermeture.

tabPane.addTab(title, tabBody);
int index = tabPane.indexOfTab(title);
JPanel pnlTab = new JPanel(new GridBagLayout());
pnlTab.setOpaque(false);
JLabel lblTitle = new JLabel(title);
JButton btnClose = new JButton("x");

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;

pnlTab.add(lblTitle, gbc);

gbc.gridx++;
gbc.weightx = 0;
pnlTab.add(btnClose, gbc);

tabPane.setTabComponentAt(index, pnlTab);

btnClose.addActionListener(myCloseActionHandler);

Maintenant ailleurs, j'établis le gestionnaire d'actions ...

public class MyCloseActionHandler implements ActionListener {

    public void actionPerformed(ActionEvent evt) {

        Component selected = tabPane.getSelectedComponent();
        if (selected != null) {

            tabPane.remove(selected);
            // It would probably be worthwhile getting the source
            // casting it back to a JButton and removing
            // the action handler reference ;)

        }

    }

}

Maintenant, vous pouvez tout aussi facilement utiliser n'importe quel composant que vous aimez et y attacher un écouteur de souris et surveiller les clics de souris ...

Mise à jour

L'exemple ci-dessus supprimera uniquement l'onglet actuellement actif, il existe plusieurs façons de résoudre ce problème.

Le mieux est probablement de fournir un moyen à l'action de trouver l'onglet auquel elle est associée ...

public class MyCloseActionHandler implements ActionListener {

    private String tabName;

    public MyCloseActionHandler(String tabName) {
        this.tabName = tabName;
    }

    public String getTabName() {
        return tabName;
    }

    public void actionPerformed(ActionEvent evt) {

        int index = tabPane.indexOfTab(getTabName());
        if (index >= 0) {

            tabPane.removeTabAt(index);
            // It would probably be worthwhile getting the source
            // casting it back to a JButton and removing
            // the action handler reference ;)

        }

    }

}   

Celui-ci utilise le nom de tab (comme utilisé avec JTabbedPane#addTab) pour rechercher puis supprimer l'onglet et son composant associé ...

43
MadProgrammer

J'ai trouvé un exemple d'onglet (sur le site Java) qui semble faire cela, au moins dans le leur. (Bien que je pensais, quand je l'ai essayé dans le passé, qu'il fermait également le onglet sélectionné, bien que cela fonctionne correctement lorsque vous exécutez leur exemple, bien que je pense que lorsque je l'ai mis à jour pour fonctionner sur un bloc-notes Java bloc-notes, il fermait l'onglet actuellement sélectionné, bien que je l'ai peut-être fait faux.

http://docs.Oracle.com/javase/tutorial/displayCode.html?code=http://docs.Oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ ButtonTabComponent.Java

Oui, mon truc fonctionne maintenant! Cela fonctionnera pour l'onglet réel, plutôt que l'onglet actuellement sélectionné!

6
MongooseLover

J'espère que vous avez la réponse à votre question. Je veux donner un lien qui m'a été très utile.

JTabbedPane avec un bouton de fermeture

Voici également du code.

public static void createAndShowGUI()
{
    JFrame frame = new JFrame("Tabs");
    frame.setMinimumSize(new Dimension(500, 200));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTabbedPane tabbedPane = new JTabbedPane();

    JPanel panel = new JPanel();
    panel.setOpaque(false);
    tabbedPane.add(panel);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel), getTitlePanel(tabbedPane, panel, "Tab1"));

    JPanel panel1 = new JPanel();
    panel1.setOpaque(false);
    tabbedPane.add(panel1);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel1), getTitlePanel(tabbedPane, panel1, "Tab2"));

    JPanel panel2 = new JPanel();
    panel2.setOpaque(false);
    tabbedPane.add(panel2);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel2), getTitlePanel(tabbedPane, panel2, "Tab3"));

    JPanel panel3 = new JPanel();
    panel3.setOpaque(false);
    tabbedPane.add(panel3);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel3), getTitlePanel(tabbedPane, panel3, "Tab4"));

    frame.add(tabbedPane);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
}
0
Sardar Faisal

J'ai fait quelques changements dans le code d'Oracle.

http://docs.Oracle.com/javase/tutorial/displayCode.html?code=http://docs.Oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ ButtonTabComponent.Java

Donner la possibilité d'ajouter une icône à l'onglet, plus le bouton de fermeture de l'onglet. J'espère que cela pourra aider.

public static void addTag(JTabbedPane tab, String title, Icon icon, int index){
     MouseListener close = new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            //your code to remove component
            //I use this way , because I use other methods of control than normal: tab.remove(int index);
        }

    };
    final ButtonClose buttonClose = new ButtonClose (title, icon, close );

    tab.setTabComponentAt(index, buttonClose);
    tab.validate();
    tab.setSelectedIndex(index);

}

public class ButtonClose étend JPanel {

public ButtonClose(final String title, Icon icon, MouseListener e) {
    JLabel ic = new JLabel(icon);
    ic.setSize(icone.getIconWidth(), icone.getIconHeight());

    JLabel text= new JLabel(title);
    text.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));

    ButtonTab button = new ButtonTab();
    button.addMouseListener(e);
    button.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));

    JPanel p = new JPanel();
    p.setSize(getWidth() - icone.getIconWidth(), 15);
    p.add(text);
    p.add(button);

    add(ic);
    add(p);
}

private class ButtonTab extends JButton {

    public ButtonTab() {
        int size = 13;
        setPreferredSize(new Dimension(size, size));
        setToolTipText("Close");

        setUI(new BasicButtonUI());

        setFocusable(false);
        setBorderPainted(false);

        addMouseListener(listener);
        setRolloverEnabled(true);
    }

    @Override
    public void updateUI() {
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();

        if (getModel().isPressed()) {
            g2.translate(1, 1);
        }
        g2.setStroke(new BasicStroke(2));
        g2.setColor(new Color(126, 118, 91));

        if (getModel().isRollover()) {
            g2.setColor(Color.WHITE);
        }

        int delta = 3;
        g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
        g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
        g2.dispose();
    }
}

private final MouseListener listener = new MouseAdapter() {
    @Override
    public void mouseEntered(MouseEvent e) {
        Component component = e.getComponent();
        if (component instanceof AbstractButton) {
            AbstractButton button = (AbstractButton) component;
            button.setContentAreaFilled(true);
            button.setBackground(new Color(215, 65, 35));
        }
    }

    @Override
    public void mouseExited(MouseEvent e) {
        Component component = e.getComponent();
        if (component instanceof AbstractButton) {
            AbstractButton button = (AbstractButton) component;
            button.setContentAreaFilled(false); //transparent
        }
    }
};

}

0
Fábio Bertotti

Vous pouvez avoir un JLabel nommé "x" et utiliser le mouseListener

 private final JLabel l = new JLabel(); // this is the label for tabbedPane
 private final JLabel b = new JLabel("x");//Close Button
 if (closeable)
        {
            b.setToolTipText("Click to close");

            b.setOpaque(false);
            b.setBackground(Color.gray);

            b.addMouseListener(new MouseAdapter()
            {
                @Override
                public void mouseExited(MouseEvent e)
                {
                    b.setBorder(bordere);
                    b.setOpaque(false);
                }

                @Override
                public void mouseEntered(MouseEvent e)
                {
                    b.setBorder(borderl);
                }

                @Override
                public void mouseReleased(MouseEvent e)
                {
                    b.setOpaque(false);
                    b.repaint();

                    if (b.contains(e.getPoint()))
                    {
                        b.setBorder(borderl);

                        if (confirmTabClosing())
                        {
                            tab.remove(tabIndex());
                            if(tab.getTabCount() == 0)
                                spacialTabComponent.maximizeOrRestore.doClick();
                        }
                    }
                    else
                        b.setBorder(bordere);

                }

                @Override
                public void mousePressed(MouseEvent e)
                {
                    b.setOpaque(true);
                    b.repaint();
                }
            });

            b.setBorder(bordere);
            add(b, getLeftAlignedBothFilledGBC(1, 0, new Insets(0, 0, 0, 0), 0, 0));
        }



    }
0
Diya
jbCloseButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
                jtbMainTabbedPane.remove(index);
            }
});
0
Shaheedul Islam

Découvrez Peter-Swing ici . Il contient une classe JClosableTabbedPane, ainsi que de nombreuses autres.

Lorsque vous téléchargez le fichier jar, vous pouvez l'exécuter et avoir des exemples de toutes les classes.

0
theTechnoKid