# CloseButton bei JTabbedPane



## Maxi92 (18. Apr 2011)

Hallo Leute!

Ich habe ein großes Problem!

Und zwar versuche ich nun seit einigen Stunden bei meinen Tabs diesen CloseButton zu programmieren!

Ich habe dazu die Demos von Oracle verwendet 
How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


Leider funktioniert es bei mir aber irgendwie nicht! Mein x befindet sich immer im TabbedPane und nicht dort wo zb. "TAB 1" steht!

Ein Problem dürfte evtl. sein, dass ich beim erzeugen eines neuen Tabs, als Component ein von mir gestaltetes Panel übergebe! Da dieses Singleton ist mache ich vl. etwas falsch!
Weil ich habe den Code aus dem Beispiel von Oracle http://download.oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ButtonTabComponent.java einfach in meinen Konsturktor kopiert und auf meine Werte abgeändert???

Mein Panel welches ich einfügen möchte:


```
package gui;
import business.*;
import data.*;
import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;

public class WinkelEinstellungenPanel extends javax.swing.JPanel
{
    private final JTabbedPane tabbedPane;


    /** Creates new form WinkelEinstellungenPanel */
    private WinkelEinstellungenPanel(final JTabbedPane tabbedPane)
    {
        super(new FlowLayout(FlowLayout.LEFT, 0, 0));

        if (tabbedPane == null)
        {
            throw new NullPointerException("TabbedPane is null");
        }
        this.tabbedPane = tabbedPane;


        setOpaque(false);

        //make JLabel read titles from JTabbedPane
        JLabel label = new JLabel()
        {
            public String getText()
            {
                int i = tabbedPane.indexOfTabComponent(WinkelEinstellungenPanel.this);
                if (i != -1)
                {
                    return tabbedPane.getTitleAt(i);
                }
                return null;
            }
        };

        add(label);
        //add more space between the label and the button
        label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
        //tab button
        JButton button = new TabButton();
        add(button);
        //add more space to the top of the component
        setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));

       initComponents();

        //Erstellen des Formatierten Textfeldes für den GesamtWinkelSoll
        NumberFormat numberFormat = NumberFormat.getIntegerInstance();
        tfWinkelGesSoll = new JFormattedTextField(numberFormat);
        tfWinkelGesSoll.setColumns(8);
        GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
        paEingabe.add(tfWinkelGesSoll, gridBagConstraints);

        //Laden der Datei
        String pfad = System.getProperty("user.dir") + "//Daten//Bilddateien//Für Winkeleinstellung2.jpg";
        JLabel lab = new JLabel(new ImageIcon(pfad));
        paSkizze.add(lab);

        winkelIstThread = new SetWinkelIstThread();

        isWinkelEinstellenPressed = false;
        shortcutInitialisierung();
    }

    private class TabButton extends JButton implements ActionListener
    {
        public TabButton()
        {
            int size = 17;
            setPreferredSize(new Dimension(size, size));
            setToolTipText("close this tab");
            //Make the button looks the same for all Laf's
            setUI(new BasicButtonUI());
            //Make it transparent
            setContentAreaFilled(false);
            //No need to be focusable
            setFocusable(false);
            setBorder(BorderFactory.createEtchedBorder());
            setBorderPainted(false);
            //Making nice rollover effect
            //we use the same listener for all buttons
            addMouseListener(buttonMouseListener);
            setRolloverEnabled(true);
            //Close the proper tab by clicking the button
            addActionListener(this);
        }

        public void actionPerformed(ActionEvent e)
        {
            int i = tabbedPane.indexOfTabComponent(WinkelEinstellungenPanel.this);
            if (i != -1)
            {
                tabbedPane.remove(i);
            }
        }

        //we don't want to update UI for this button
        public void updateUI()
        {
        }

        //paint the cross
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            //shift the image for pressed buttons
            if (getModel().isPressed())
            {
                g2.translate(1, 1);
            }
            g2.setStroke(new BasicStroke(2));
            g2.setColor(Color.BLACK);
            if (getModel().isRollover())
            {
                g2.setColor(Color.MAGENTA);
            }
            int delta = 6;
            g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
            g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
            g2.dispose();
        }
    }
    private final static MouseListener buttonMouseListener = new MouseAdapter()
    {
        @Override
        public void mouseEntered(MouseEvent e)
        {
            Component component = e.getComponent();
            if (component instanceof AbstractButton)
            {
                AbstractButton button = (AbstractButton) component;
                button.setBorderPainted(true);
            }
        }

        @Override
        public void mouseExited(MouseEvent e)
        {
            Component component = e.getComponent();
            if (component instanceof AbstractButton)
            {
                AbstractButton button = (AbstractButton) component;
                button.setBorderPainted(false);
            }
        }
    };

    /** @return Liefert die einzige Instanz dieser Klasse */
    public static synchronized WinkelEinstellungenPanel getInstance(final JTabbedPane tabbedPane)
    {
        if (winkelEinstellungsInstance == null)
        {
            winkelEinstellungsInstance = new WinkelEinstellungenPanel(tabbedPane);
        }
        return winkelEinstellungsInstance;
    }
}
```

Meine HauptGUI in der sich das JTabbedPane befindet

```
private void onWinkelEinstellungen(java.awt.event.ActionEvent evt)                                       
    {                                                   
        initTabComponent(0);

        jdpHauptfenster.add("Winkeleinstellungen",new JLabel("Winkeleinstellungen"));

        jdpHauptfenster.setComponentAt(1,WinkelEinstellungenPanel.getInstance(jdpHauptfenster));
} 

private void initTabComponent(int i)
{
     jdpHauptfenster.setComponentAt(i, new ButtonTabComponent(jdpHauptfenster));
     //die Klasse ButtonTabComponent ist die Beispielklasse von Oracle
}
```

jdpHauptfenster ist der Name meines JTabbedPane, das ich per GUIBuilder einfüge!

Wäre echt super wenn mir jemand helfen könnte?!

Danke schon mal im Voraus!
max


----------



## hansmueller (18. Apr 2011)

Hallo,

probier es mal mit 
	
	
	
	





```
.setTabComponentAt()
```
.
Damit tut man eine Komponente z. B. das Label mit dem Button einem bestimmten Reiter zuweisen bzw. hinzufügen.

MfG
hansmueller


----------



## Maxi92 (18. Apr 2011)

wo meinst Du soll ich das machen?
weil ich rufe ja in der HauptGUI, im beigefügten Code Zeile 7, diesen Befehl auf?

mfG


----------



## hansmueller (19. Apr 2011)

Hallo,



			
				Maxi92 hat gesagt.:
			
		

> weil ich rufe ja in der HauptGUI, im beigefügten Code Zeile 7, diesen Befehl auf?



Nein, machst du nicht. Du verwendest 
	
	
	
	





```
.setComponentAt()
```
 und nicht 
	
	
	
	





```
.setTabComponentAt()
```
.
Mit dem einen fügst du den Inhalt des entsprechenden Reiters hinzu, der dargestellt werden soll, wenn dieser ausgewählt wurde. Mit dem anderen fügst du die Komponenten für die (nennen wir es mal) "Reiterbeschriftung" bzw. "Reiterlaschendarstellung" für den jeweiligen Reiter hinzu.
Du mußt natürlich beide Befehle ausführen. Zum einen um den Inhalt in die Reiter zu bekommen, zum anderen, um die "Reiterlaschen" entsprechend deiner Wünsche zu beschriften bzw. zu gestallten.

MfG
hansmueller


----------



## Maxi92 (19. Apr 2011)

schon klar!

tschuldigung...so ein dummer Fehler -.-

danke für Deine Hilfe!


----------

