Comment ajouter bouton Fermer à un onglet JTabbedPane?

je travaille avec un JTabbedPane, j'ai besoin d'ajouter un bouton Fermer dans les onglets pour fermer celui en cours.

j'ai cherché et comme je comprends je dois étendre de JPanel et ajouter le bouton Fermer comme ils disent ici Mais, est-il possible d'ajouter les boutons de fermeture extension JTabbedPane ou est-il un moyen plus facile de le faire?

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

27
demandé sur Herman 2012-07-19 06:30:41

7 réponses

Essentiellement, vous allez avoir besoin de fournir un "convertisseur" de l'onglet. Jetez un oeil à JTabbedPane.setTabComponentAt(...) pour plus d'informations.

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

je crée typiquement 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 proche.

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);

or somewhere else, I établir le gestionnaire d'action...

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 utilisez tout aussi facilement n'importe quel composant que vous aimez et attachez un écouteur de souris à lui et surveillez les clics de souris...

mise à Jour

L'exemple ci-dessus ne supprimera que l'onglet actuellement actif, il y a plusieurs façons de corriger cela.

Le mieux est probablement fournir des moyens pour l'action pour trouver l'onglet auquel il est associé...

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 ;)

        }

    }

}   

ceci utilise le nom de l'onglet (comme il est utilisé avec JTabbedPane#addTab) pour trouver et ensuite supprimer l'onglet et son composant associé...

43
répondu MadProgrammer 2015-07-20 00:09:38

j'ai trouvé un exemple d'onglet (du 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 aussi l'onglet actuellement sélectionné, bien qu'il fonctionne correctement quand vous exécutez leur exemple, bien que je pense que lorsque je l'ai mis à jour pour travailler sur un bloc-notes Java tabbed, il fermait l'onglet actuellement sélectionné, bien que peut-être je l'ai fait mal.

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
répondu MongooseLover 2013-08-26 03:20:26

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

JTabbedPane avec un bouton de fermeture

voici aussi 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
répondu Sardar Faisal 2014-02-16 11:27:33

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

donnant la possibilité d'ajouter une icône à l'onglet , plus le bouton Fermer l'onglet. Espérons que cela aide.

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 s'étend Composite {

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
répondu Fábio Bertotti 2014-11-06 06:09:07

découvrez Pierre-Swing ici. Il a un JClosableTabbedPane de la classe, ainsi que beaucoup d'autres.

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

0
répondu theTechnoKid 2014-11-19 02:29:01

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
répondu Diya 2014-12-02 12:18:18
jbCloseButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
                jtbMainTabbedPane.remove(index);
            }
});
0
répondu Shaheedul Islam 2015-10-24 11:17:06