Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137

    problema con JTabbedPane

    Ho tovato in rete questo codice per aggiungere il tasto di chiusura ad un jTabbedPane
    public class TabComponent extends JPanel implements ActionListener {
    private JTabbedPane pane;
    public TabComponent(String title, JTabbedPane pane) {
    this.pane = pane;
    setOpaque(false);
    JLabel label = new JLabel(title);
    add(label);
    JButton button = new JButton("x");
    button.setPreferredSize(new java.awt.Dimension(15, 15));
    button.setMargin(new Insets(0,0,0,0));
    button.addActionListener(this);
    add(button);
    }

    public void actionPerformed(ActionEvent e) {
    int j = (pane.indexOfTabComponent(TabComponent.this));
    if (j != -1)
    pane.remove(j);
    }

    La nuova tab viene creata con questo codice

    private int j=0;
    ...
    ...
    newFileMenuItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setFileFilter( new Filtro(".ds2",".ds2") );
    int returnValue = fileChooser.showOpenDialog(null);
    if (returnValue == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    namedataset=selectedFile.getName();
    perdataset=selectedFile.getAbsolutePath(); }
    createPage1(namedataset,perdataset);
    tabbedPane.addTab( namedataset, panel1 );
    tabbedPane.setTabComponentAt(j, new TabComponent (namedataset,tabbedPane));
    j++;
    }
    });
    ...
    ...
    Tutto sembra funzionare , ma appena chiudo un tab e ne apro uno nuovo , questo mi esce senza la x per chiudere. i successivi si aprono con la x, il problema sorge appena ne chiudo qualcuno.

    Come mai?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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);
                    }
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137
    GRAZIE

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.