2012-07-19 19 views
25

Sto lavorando con un JTabbedPane, ho bisogno di aggiungere un pulsante di chiusura nelle schede per chiudere quello corrente.Come aggiungere il pulsante di chiusura a una scheda di JTabbedPane?

Sono stato alla ricerca e come ho capito io deve estendersi da JPanel e aggiungere il pulsante di chiusura, come si dice here Ma, c'è un modo per aggiungere i pulsanti vicino estendono JTabbedPane o c'è un modo più semplice per farlo?

Grazie in anticipo, ho davvero apprezzato il vostro tempo e il vostro aiuto.

+1

Questo potrebbe essere utile - http://stackoverflow.com/questions/10620630/add-a-jlabel-in -the-jtabbedpane-header – user1329572

+0

Grazie ho intenzione di dare un'occhiata – Herman

risposta

39

In sostanza, è necessario fornire un "renderer" per la scheda. Dai un'occhiata a JTabbedPane.setTabComponentAt(...) per maggiori informazioni.

L'idea di base è fornire un componente che verrà visualizzato nella scheda.

Generalmente creo un JPanel, al quale aggiungo una JLabel (per il titolo) e, a seconda di ciò che voglio visualizzare, un qualche tipo di controllo che agisce da azione ravvicinata.

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

Ora da qualche altra parte, stabilisco il gestore di azione ...

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

     } 

    } 

} 

Ora, altrettanto facilmente utilizzare qualsiasi componente che ti piace e allega un listener del mouse ad esso e monitorare i clic del mouse. ..

Aggiornato

l'esempio rimuoverà solo la scheda attualmente attiva, ci sono un paio di wa ys per risolvere questo problema.

La cosa migliore è quello di fornire probabilmente alcuni mezzi per l'azione di trovare la scheda è associato con ...

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

     } 

    } 

} 

Questo utilizza il nome della scheda (come quello usato con JTabbedPane#addTab) per trovare e rimuovere il scheda e il suo componente associato ...

+0

Grazie !!! sembra grandioso. Vado a controllarlo al pomeriggio. Apprezzo molto il tuo aiuto – Herman

+1

@Herman no probs :) – MadProgrammer

+1

Provalo. Se si legge il codice, ActionListener utilizza la scheda selezionata. Associare il componente scheda al listener di azioni, trovare l'indice e rimuoverlo invece – MadProgrammer

6

Ho trovato un esempio di tabulazione (dal sito java) che sembra farlo, almeno nella loro. (Anche se ho pensato, quando ho provato in passato, che ha anche chiuso la scheda attualmente selezionata, anche se funziona correttamente quando si esegue il loro esempio, anche se penso che quando l'ho aggiornato per lavorare su un blocco note java a schede, si stava chiudendo la scheda attualmente selezionata, anche se forse ho fatto male.

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

Sì, la mia cosa sta lavorando ora! questo lavoro per la scheda reale, piuttosto che la scheda correntemente selezionata!

+0

Tuttavia, dovresti sapere che così facendo, rovina la tua capacità di impostare le icone delle schede. (A meno che tu non voglia andare a pasticciare con i livelli inferiori e guardare il codice sorgente e fare paintComponent() e tutte quelle cose divertenti, non riesco a vedere un modo per aggirare quel problema.) – MongooseLover

0

Speriamo che Ho la risposta alla tua domanda: voglio dare un link che mi è stato molto utile

JTabbedPane with a close button

Ecco un po 'di codice.

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

Ho apportato alcune modifiche al codice di Oracle.

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

Dare la possibilità di aggiungere un'icona alla scheda, più il tasto tab vicino. Spero possa aiutare.

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 estende 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

Partenza Peter-Swing here. Ha una classe JClosableTabbedPane al suo interno, così come molti altri.

Quando si scarica il file jar è possibile eseguirlo e disporre di esempi di tutte le classi.

0

si può avere un JLabel denominato "x" e utilizzare il 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
jbCloseButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton); 
       jtbMainTabbedPane.remove(index); 
      } 
}); 
Problemi correlati