JTabbedPane Closebutton integrieren

LittleJava

Mitglied
Guten Morgen,

ich adde durch einen Klick auf einen Button ein Tab zu meinem MainFrame:
Java:
public void addTab(String tabName) {
		JPanel p = new JPanel();
		p.setLayout(new BorderLayout());
		JTextArea tArea = new JTextArea(140, 120);
		tArea.setEditable(false);

		textScrollPane = new JScrollPane(tArea,
				ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		p.add(textScrollPane);
		qTabPanel.addTab(tabName, p);
		
		areas.put(tabName, tArea);

	}

Nun möchte ich gerne, dass neben dem Tabname ein Button bei jeder Erzeugung eines Tabs neben dem Tabnamen ist und beim Klick darauf, dass Tab geschlossen wird.
Ausprobiert habe ich es natürlich, so dass ich ein Button erzeuge und versuche diesen dem Tab hinzu zufügen. Diesen füge ich dann beim ActionListener folgenden Befehl ein:
Java:
// qTabPanel.setComponentAt(qTabPanel.getTabCount() - 1, null);
Nur sind nur zwei 2 Parameter bei der Übergabe beim add Befehl erlaubt:

Java:
qTabPanel.addTab(tabName, p);
Wo kann ich den Button hinzufügen?
Vielen Dank für eure Unterstützung.
 

turtle

Top Contributor
Du kannst über setTabComponentAt ein beliebiges Panel einem Tab hinzufügen, also auch eins in dem ein Close-Button enthalten ist. Hier eine kleine Demo, die ich mal schnell zusammengehackt habe.

Java:
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Close extends JPanel {
	JTabbedPane tabPane;
	private ContentPanel contentPanel;

	class ContentPanel extends JPanel {
		private JLabel contentLabel = null;

		public ContentPanel() {
			contentLabel = new JLabel("Content");
			add(contentLabel);
		}

	}

	public Close() {
		setLayout(new BorderLayout());
		tabPane = new JTabbedPane();
		contentPanel = new ContentPanel();
		tabPane.addTab("Tab-1", contentPanel);
		tabPane.addTab("Tab-2", new JLabel("2"));
		tabPane.addTab("Tab-3", new JLabel("3"));
		int index = tabPane.indexOfTab("Tab-1");
		JPanel pnlTab = new JPanel(new GridBagLayout());
		pnlTab.setOpaque(false);
		JLabel lblTitle = new JLabel("Turtle");
		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(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("close it");
				tabPane.remove(contentPanel);
			}
		});
		add(tabPane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Close demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new Close());
		frame.pack();
		frame.setVisible(true);
	}
}
 

LittleJava

Mitglied
Ich würde gerne bei mir folgende Klasse einbinden:

Java:
package de.dbsystems.risbhf.abnehmerqueue.gui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicButtonUI;

public class ButtonTabComponent extends JPanel {
	 private final JTabbedPane pane;
	    private final JLabel label;
	    private final JButton button = new TabButton();

	    public ButtonTabComponent(String title, JTabbedPane pane) {
	        //unset default FlowLayout' gaps
	        super(new FlowLayout(FlowLayout.LEFT, 0, 0));
	        if (pane == null) {
	            throw new NullPointerException("TabbedPane is null");
	        }
	        this.pane = pane;
	        setOpaque(false);
	        label = new JLabel(title);
	        
	        add(label);
	        //add more space between the label and the button
	        label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
	        add(button);
	        //add more space to the top of the component
	        setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
	    }

	    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 = pane.indexOfTabComponent(ButtonTabComponent.this);
	            if (i != -1) {
	                pane.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;
	            Stroke stroke = g2.getStroke();
	            //shift the image for pressed buttons
	            if (!getModel().isPressed()) {
	                g2.translate(-1, -1);
	            } 
	            g2.setStroke(new BasicStroke(2));
	            g.setColor(Color.BLACK);
	            if (getModel().isRollover()) {
	                g.setColor(Color.MAGENTA);
	            }            
	            int delta = 6;
	            g.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
	            g.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
	            //leave the graphics unchanged
	            if (!getModel().isPressed()) {
	                g.translate(1, 1);
	            }
	            g2.setStroke(stroke);
	        }
	    }

	    private final static MouseListener buttonMouseListener = new MouseAdapter() {
	        public void mouseEntered(MouseEvent e) {
	            Component component = e.getComponent();
	            if (component instanceof AbstractButton) {
	                AbstractButton button = (AbstractButton) component;
	                button.setBorderPainted(true);
	            }
	        }

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

}

Ich verstehe nicht, wie ich das konkret bei meinem code einbinde, da ich ja bereits tabs durch einen ButtonKlick erzeuge. Hier würde ich die obige Beispielklasse bzw. deine Klasse bei mir einbinden:

qTabPanel.setTabComponentAt(null, new ButtonTabComponent(tabName, qTabPanel));

Da wird die Übergabe eines Titels verlangt, den ich übergebe als "tabName". Dazu kommt die Übergabe von JTabbedPane, die ich durch die Übergabe meines Tabs "qTabPanel" gewährleiste. Des Weiteren wird an der Stelle, die ich "null" gesetzt habe, ein Index verlangt. Was ist dieser Index bzw, wie behandele ich den? Den Titel übergebe ich meiner Methode addTab() schon beim Aufrufen (siehe Anfangspost bei mir). Ich bin von der Komplexität gerade echt überfordert und verzweifelt. Turtle ich verstehe nicht richtig, wie dein Beispiel mir helfen soll, dass in mein Projekt einzubinden. Meine Verwirrung ist groß.
 
Zuletzt bearbeitet:

turtle

Top Contributor
Java:
Was ist dieser Index bzw, wie behandele ich den?

Eine JTabbedPane verwaltet eine Liste von Tabs 0..n. in meinem Beispiel gilt

  1. Tab-1-->contentPanel-->mit einem JLabel("Content") auf Index 0
  2. Tab-2-->mit einem JLabel("2") auf Index 1
  3. Tab-3-->mit einem JLabel("3") auf Index 2
Also gibt Index an, welches Tab gemeint ist. Im Beispiel habe ich nur auf ContentPanel den Close-Button und weiß daher beim Schließen genau, welches Tab gemeint ist.

Wenn du mehrere/alle Tabs per Close-Button schließen möchtest, musst du halt wissen, welche Tabs vorhanden sind und welches geschlossen werden soll. Hier hilft vielleicht tabPane.getSelectedIndex().

PS: In deinem Code verwirrt mich noch das paintComponent() auf TabButton. Ich würde hier einfach ein Icon nehmen.
 

LittleJava

Mitglied
Danke dir Turtle.
Aber noch ein paar Punkte sind für mich offen:

Bei meiner Funktion addtab() wird ein Panel erstellt, welchem eine Scrollbar mit einer TextArea übergeben wird. Dieses Panel sowie den Tabtitel füge ich dann meinem JTabbedPane qTabPane hinzu. Wie soll ich den noch ein Panel wie z.B. deins einbinden?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M CloseButton bei JTabbedPane AWT, Swing, JavaFX & SWT 4
K LookAndFeel JTabbedPane mit Icon und CloseButton AWT, Swing, JavaFX & SWT 2
BabySuna darstellungsprobleme mit JTabbedPane und GridBagLayout AWT, Swing, JavaFX & SWT 8
I JTabbedPane mit DnD, [x]-Schaltfläche, [+]-Schaltfläche usw. AWT, Swing, JavaFX & SWT 1
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
B JTabbedPane Tabs anordnen AWT, Swing, JavaFX & SWT 2
D JTabbedPane GUI Experimente AWT, Swing, JavaFX & SWT 4
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
L JTabbedPane mit for Schleife aufbauen AWT, Swing, JavaFX & SWT 4
J JTabbedPane Vollbild wenn Tabwechsel AWT, Swing, JavaFX & SWT 1
B StateChangeListener auf JTabbedPane AWT, Swing, JavaFX & SWT 5
F jTabbedPane Tabwechsel deaktivieren AWT, Swing, JavaFX & SWT 2
J JTabbedPane: close Button Problem AWT, Swing, JavaFX & SWT 2
J JTabbedPane: table in new tab: tooltip benutzt die column-widths von table in erstem geöffneten tab AWT, Swing, JavaFX & SWT 17
M JTabbedPane verändern mit Nimbus Look and Feel AWT, Swing, JavaFX & SWT 1
F JTabbedPane bestimmten Tab ansprechen AWT, Swing, JavaFX & SWT 13
F JTabbedPane mit Button zum Hinzufügen eines neuen Tabs AWT, Swing, JavaFX & SWT 6
BRoll JTabbedPane setTitleAt OutOfBoundsExc AWT, Swing, JavaFX & SWT 4
K JTabbedPane Tab Markierung / Selektion AWT, Swing, JavaFX & SWT 4
B Custom JTabbedPane-Tab-Design AWT, Swing, JavaFX & SWT 2
J JTabbedPane Grafik unterhalb der Tabs AWT, Swing, JavaFX & SWT 3
H Swing JTabbedPane: Zusätzliche Buttons neben den Tabs AWT, Swing, JavaFX & SWT 7
V JTabbedPane Eingefügte Labels verschoben AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
S Swing JTabbedPane: Nur nach ButtonClick und nicht nach Click auf Tab ins nächste Tab wechseln AWT, Swing, JavaFX & SWT 2
P JTabbedPane per Menuitem erstellen AWT, Swing, JavaFX & SWT 20
K Swing JTabbedPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 19
B Swing JTabbedPane in JApplet -> Reiter bei Aktualisation mehrmals zu sehen AWT, Swing, JavaFX & SWT 3
M JTabbedPane -> setSelectedIndex funzt nicht AWT, Swing, JavaFX & SWT 3
D Bestimmtes JPanel innerhalb eines JTabbedPane ansprechen AWT, Swing, JavaFX & SWT 2
M jtabbedpane aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 13
J Swing Letzten Tab einer JTabbedPane ermitteln AWT, Swing, JavaFX & SWT 6
T JTabbedPane - neuen Tab zwischen zwei anderen Tabs hinzufügen AWT, Swing, JavaFX & SWT 2
B Hilfe zu JTable und JTabbedPane AWT, Swing, JavaFX & SWT 18
hdi LookAndFeel Nimbus BUG mit JTabbedPane?! AWT, Swing, JavaFX & SWT 5
hdi Swing Problem mit JTabbedPane AWT, Swing, JavaFX & SWT 2
A LookAndFeel Rollover Effekt bei JTabbedPane deaktivieren (Nimbus) AWT, Swing, JavaFX & SWT 8
T Inhalt von einem Tab an JTabbedPane größe ausrichten? AWT, Swing, JavaFX & SWT 2
S JTabbedPane Problem AWT, Swing, JavaFX & SWT 3
S JTabbedPane AWT, Swing, JavaFX & SWT 4
D JTabbedPane mit Eventlistener versehen? AWT, Swing, JavaFX & SWT 9
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
K JTabbedPane setName() für jedes Tab AWT, Swing, JavaFX & SWT 2
G JTabbedPane - Länge der Reiter beeinflussen? AWT, Swing, JavaFX & SWT 9
G Swing JTabbedPane Was für ein Border wird da um die Tabs gezeichnet? AWT, Swing, JavaFX & SWT 6
S Swing Komponentengröße in JTabbedPane AWT, Swing, JavaFX & SWT 7
M Ein Tab eine JTabbedPane durch Button Druck öffen AWT, Swing, JavaFX & SWT 2
Y LookAndFeel JTabbedPane: Tab-Farbe mit Nimbus setzen AWT, Swing, JavaFX & SWT 3
P Swing JTabbedPane mit JButton einen anderen Tab anzeigen AWT, Swing, JavaFX & SWT 9
D JTabbedPane zentrieren AWT, Swing, JavaFX & SWT 2
S Swing JTabbedPane: Inhalt soll oben links anfangen AWT, Swing, JavaFX & SWT 6
Mike90 JTabbedPane Größe anpassen AWT, Swing, JavaFX & SWT 17
F JTabbedPane Reiter breite AWT, Swing, JavaFX & SWT 4
B JTabbedPane mit Enumeration dynamisch füllen AWT, Swing, JavaFX & SWT 5
D Swing Tab in JTabbedPane AWT, Swing, JavaFX & SWT 5
A JFrame > JTabbedPane > JPanel > addKeyListener AWT, Swing, JavaFX & SWT 18
D JTabbedPane - Farbe ändern im Bereich hinter den Reitern AWT, Swing, JavaFX & SWT 2
M JTabbedPane - Tab auslesen AWT, Swing, JavaFX & SWT 2
H Swing Problem mit JTabbedPane AWT, Swing, JavaFX & SWT 9
D jtabbedpane Event VOR tab-Wechsel AWT, Swing, JavaFX & SWT 3
S Border von JTabbedpane-Tab? AWT, Swing, JavaFX & SWT 3
M JTabbedPane Docable? AWT, Swing, JavaFX & SWT 3
L Swing JTabbedPane - Index vom Tab AWT, Swing, JavaFX & SWT 3
D Swing JTabbedPane, TabComponent & Popup AWT, Swing, JavaFX & SWT 4
F Borders von JTabbedPane und JScrollPane AWT, Swing, JavaFX & SWT 5
W JTabbedPane Größe anpassen AWT, Swing, JavaFX & SWT 4
G Swing JTabbedPane vergrößern AWT, Swing, JavaFX & SWT 2
H Swing Register (jTabbedPane) dynamisch hinzufügen? AWT, Swing, JavaFX & SWT 7
D Tabs von JTabbedPane stylen AWT, Swing, JavaFX & SWT 6
U JTabbedPane: Layout-Probleme bei addTab zur Laufzeit AWT, Swing, JavaFX & SWT 2
1 JTabbedPane Tab ausdehnen AWT, Swing, JavaFX & SWT 3
F Swing JTabbedPane: Zur Laufzeit die Tabreihenfolge ändern AWT, Swing, JavaFX & SWT 2
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
D Swing Probleme bei mit JTabbedPane.getChildren() AWT, Swing, JavaFX & SWT 4
I Swing Randnutzung bei JTabbedPane.LEFT AWT, Swing, JavaFX & SWT 2
ABstraCT JTabbedPane - click wird nicht immer ausgeführt ! AWT, Swing, JavaFX & SWT 10
P JTabbedPane und fill? AWT, Swing, JavaFX & SWT 2
D Swing mehrere JTable in separaten Tabs einer JTabbedPane AWT, Swing, JavaFX & SWT 2
G JTabbedPane transparent AWT, Swing, JavaFX & SWT 2
S Swing JTabbedPane: Resize des JFrame bei Tab wechsel AWT, Swing, JavaFX & SWT 8
thE_29 Swing JTabbedPane Focus von Komponenten außerhalb AWT, Swing, JavaFX & SWT 10
S Scrollbar in einem JTabbedPane AWT, Swing, JavaFX & SWT 4
A Schriftfarbe von jTabbedPane und Button Ändern AWT, Swing, JavaFX & SWT 7
R JTabbedPane Selektion verfolgen? AWT, Swing, JavaFX & SWT 2
byte JTabbedPane - Insets entfernen AWT, Swing, JavaFX & SWT 7
S JTabbedPane child setBounds AWT, Swing, JavaFX & SWT 4
J jTabbedPane mit jPanel füllen AWT, Swing, JavaFX & SWT 14
A JTable im JTabbedPane -> Überschriften werden nicht angez AWT, Swing, JavaFX & SWT 2
V Extended JTabbedPane AWT, Swing, JavaFX & SWT 7
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
G JTabbedPane wird groesser wenn man anderen Tab auswaehlt. AWT, Swing, JavaFX & SWT 2
A JTabbedPane Tabwechsel rausfinden AWT, Swing, JavaFX & SWT 2
O JTabbedPane - Selected Color? AWT, Swing, JavaFX & SWT 1
T Wie aktualisiere ich die Contents einer JTabbedPane? AWT, Swing, JavaFX & SWT 3
G JTabbedPane zentiert alles AWT, Swing, JavaFX & SWT 3
P Schließen-Button bei JTabbedPane? AWT, Swing, JavaFX & SWT 2
D Probleme mit JTabbedPane AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben