2012-07-19 15 views
25

Ich arbeite mit einem JTabbedPane, ich muss eine Schließen-Schaltfläche in den Registerkarten hinzufügen, um die aktuelle zu schließen.Wie schließe ich einen JTabbedPane Tab an?

Ich habe gesucht und als ich entnehme ich JPanel verlängern müssen und fügen Sie den Schließen-Button, wie sie here sagen Aber ist es eine Möglichkeit, die enge Tasten erstreckt JTabbedPane hinzuzufügen, oder gibt es einen einfacheren Weg, es zu tun?

Vielen Dank im Voraus, ich schätze Ihre Zeit und Ihre Hilfe.

+1

Dies kann hilfreich sein - http://stackoverflow.com/questions/10620630/add-a-jlabel-in -the-jtabbedpane-header – user1329572

+0

Danke, ich werde es überprüfen – Herman

Antwort

39

Im Wesentlichen müssen Sie einen "Renderer" für die Registerkarte bereitstellen. Werfen Sie einen Blick auf JTabbedPane.setTabComponentAt(...) für weitere Informationen.

Die Grundidee besteht darin, eine Komponente bereitzustellen, die auf der Registerkarte angeordnet wird.

Normalerweise erstelle ich ein JPanel, auf dem ich ein JLabel (für den Titel) und, je nachdem, was ich anzeigen möchte, eine Art von Steuerelement hinzufügen, die als Schließaktion fungiert.

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

Jetzt woanders, ich richte den Action-Handler ...

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

     } 

    } 

} 

Nun, die Sie gerade verwenden, wie leicht jede Komponente, die Sie mögen und eine Maus Zuhörer daran binden und die Mausklicks überwachen. ..

Das obige Beispiel aktualisiert wird die gerade aktive Registerkarte nur entfernen, gibt es ein paar wa um das zu beheben.

Das Beste ist wohl einige Mittel für die Aktion bieten die Registerkarte zu finden, es mit verknüpft ist ...

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

     } 

    } 

} 

Dieser den Namen Tab verwendet (wie bei JTabbedPane#addTab verwendet) zu finden und entfernen Sie dann die Registerkarte und seine zugehörige Komponente ...

+0

Danke !!! Das sieht großartig aus. Ich werde es am Nachmittag überprüfen. Ich schätze deine Hilfe wirklich – Herman

+1

@Herman keine probs :) – MadProgrammer

+1

Das ist versuchen. Wenn Sie den Code lesen, verwendet der ActionListener die ausgewählte Registerkarte. Sie verknüpfen die Tab-Komponente mit dem Action-Listener, suchen den Index und entfernen ihn stattdessen – MadProgrammer

6

Ich fand eine Registerkarte Beispiel (von der Java-Website), die scheint, zumindest in ihrem zu tun. (Obwohl ich dachte, als ich es in der Vergangenheit ausprobiert habe, hat es auch die aktuell ausgewählte Registerkarte geschlossen, obwohl es richtig funktioniert, wenn ich ihr Beispiel ausführe, obwohl ich denke, als ich es auf einen Tabbed Java Editor änderte, wurde es geschlossen die derzeit Registerkarte ausgewählt, aber vielleicht habe ich es falsch.

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

Ja, mein Ding arbeitet jetzt! Dies wird für die tatsächlichen Registerkarte arbeiten, anstatt der aktuell ausgewählten Tab!

+0

Obwohl Sie wissen sollten, dass dadurch Ihre Fähigkeit ruiniert, Tab-Icons zu setzen. (Es sei denn, du willst mit den unteren Ebenen herumhauen und dir den Quellcode anschauen und paintComponent() und all diese tollen Sachen machen, ich sehe kein Problem damit.) – MongooseLover

0

Sie Hoffentlich habe die Antwort auf Ihre Frage, ich möchte einen Link geben, der für mich sehr nützlich war.

JTabbedPane with a close button

Hier ist auch ein 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

Ich habe einige Änderungen im Code von Orakel vorgenommen.

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

die Möglichkeit geben, ein Symbol auf die Registerkarte hinzuzufügen, plus der Tab schließen Taste. Ich hoffe, das hilft.

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 button erweitert 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

Check out Peter-Schwingen here. Es hat eine JClosableTabbedPane Klasse, sowie viele andere.

Wenn Sie die jar Datei herunterladen, können Sie sie ausführen und Beispiele aller Klassen haben.

0

Sie haben können eine JLabel "x" genannt und verwenden Sie die 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); 
      } 
}); 
Verwandte Themen