2012-07-19 23 views
25

Pracuję z JTabbedPane, muszę dodać przycisk zamykania w kartach, aby zamknąć bieżący.Jak dodać przycisk zamknięcia do zakładki JTabbedPane?

I zostały poszukiwania i jak rozumiem muszę przedłużyć z JPanel i dodać przycisk zamykania jak mówią here Ale, czy jest jakiś sposób, aby dodać przyciski zamknięcia rozciągające JTabbedPane czy istnieje łatwiejszy sposób to zrobić?

Z góry dziękuję za poświęcony czas i pomoc.

+1

Może to być pomocne - http://stackoverflow.com/questions/10620630/add-a-jlabel-in -the-jtabbedpane-header – user1329572

+0

Dzięki, że to sprawdzę – Herman

Odpowiedz

39

Zasadniczo konieczne będzie dostarczenie "renderer" dla zakładki. Aby uzyskać więcej informacji, patrz JTabbedPane.setTabComponentAt(...).

Podstawową ideą jest dostarczenie komponentu, który zostanie umieszczony na zakładce.

Zazwyczaj tworzę JPanel, do którego dodaję JLabel (dla tytułu) i, w zależności od tego, co chcę wyświetlić, jakiś rodzaj kontroli, który działa jak akcja zamykająca.

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

teraz gdzie indziej, ja ustanowić procedurę obsługi akcji ...

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

     } 

    } 

} 

Teraz tak łatwo użyć dowolnego komponentu chcesz i dołączyć do niego słuchacza myszy i monitorowania kliknięć myszką. ..

Updated

powyższy przykład usunie tylko kartę aktualnie aktywny, istnieje kilka wa ys, aby to naprawić.

Najlepiej jest prawdopodobnie zapewnić pewne środki do działania, aby znaleźć kartę to związane z ...

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

     } 

    } 

} 

ta wykorzystuje nazwę zakładki (jako używane z JTabbedPane#addTab), aby znaleźć i usunąć tab i skojarzony z nim składnik ...

+0

Dzięki! wygląda świetnie. Sprawdzę to po południu. Naprawdę doceniam twoją pomoc – Herman

+1

@Herman no probs :) – MadProgrammer

+1

To jest próba. Jeśli odczytasz kod, ActionListener używa wybranej karty. Komponent karty skojarzony jest z detektorem działań, znajduje indeks i usuwa go zamiast tego. – MadProgrammer

6

Znalazłem przykład karty (ze strony java), która wydaje się to robić, przynajmniej w ich. (Chociaż myślałem, że kiedy próbowałem go w przeszłości, to również zamknęło aktualnie wybraną kartę, chociaż działa poprawnie po uruchomieniu ich przykładu, chociaż myślę, że kiedy zaktualizowałem go do pracy z kartą notatnika java, to było zamykanie aktualnie wybranej zakładki, choć być może zrobiłem to źle.

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

Tak, moja sprawa pracuje teraz! Będzie to działać na karcie rzeczywistego, aniżeli aktualnie wybranej zakładki!

+0

Chociaż, powinieneś wiedzieć, że przez to, to niszczy twoją zdolność by ustawić tabulacyjne ikony. (Chyba, że ​​chcesz przejść z niższymi poziomami i spojrzeć na kod źródłowy i zrobić paintComponent() i wszystkie fajne rzeczy, nie widzę sposobu na obejście tego problemu.) – MongooseLover

0

mam nadzieję, że otrzymałem odpowiedź na twoje pytanie. Chcę podać link, który był dla mnie bardzo przydatny:

JTabbedPane with a close button

Oto także kod.

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

Wprowadziłem kilka zmian w kodzie wyroczni.

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

Dając możliwość dodać ikonę do karty, plus przycisku zamykania kart. Nadzieja, która pomaga.

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

odjazdu Peter-Swing here. Ma w sobie klasę, a także wiele innych.

Po pobraniu pliku jar można go uruchomić i podać przykłady wszystkich klas.

0

Można mieć JLabel nazwie "x" i użyć 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); 
      } 
}); 
Powiązane problemy