JTabbedPane: close Button Problem

JavaOHJA

Mitglied
Hi,

ich habe close-Buttons wie bei einem Browser, jedoch weiß ich nicht, wie ich über den Button den Index des Tabs auf dem er sich in der TabbedPane befindet herausbekomme.

habs über e.toString versucht und im Buttontext ein hidden value versteckt, dass ich dann aus dem toString über substring raushole. Das funktioniert aber nur solange man die Tabs dann in der gleichen Reihenfolge schließt, in der Sie geöffnet wurde, da ja hartcodiert.


Frage: wie bekomme ich den Index des Tabs in dem der Button sitzt?

MfG



hier der Code:

Java:
public void setTabTitle(int index){
	
	JPanel pnlTab = new JPanel(new GridBagLayout());
	pnlTab.setOpaque(false);
	
	
	 JLabel lblTitle = new JLabel(mouseWahl);
	
	System.out.println("Anzahl tabs: "+tabbedPane.getTabCount());
	int tabIndex = tabbedPane.getTabCount()-1;
	
	JButton btnClose = new JButton("<HTML><font color='white'>"
			+"<input type='hidden' name='"+tabIndex+"' value= ''>"
			+ "<b>X</b></font></HTML>");
	btnClose.setBackground(Color.RED.darker());
	btnClose.setPreferredSize(new Dimension(20,20));
	btnClose.setBorder(new EmptyBorder(1,1,1,1));
	
	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);
	
	tabbedPane.setTabComponentAt(index, pnlTab);

	btnClose.addActionListener(new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			String s = e.toString();
			System.out.println(s);
			s = s.substring(101, 102);
			System.out.println(s);
			
			tabbedPane.remove(Integer.parseInt(s));
			repaint();
			
		}
	});
 
habe da eine Kleinigkeit für dich

Der Trick ist folgender: Der Header kennt sein dazugehöriges Tab. Wenn der Knopf gedrückt wird, sucht sich der Header den Index von seinem Tab anhand des Tab-Content (der sowohl dem Header, als auch der TabbedPane bekannt sind) und entfernt diesen.

Java:
package TabbedPaneWithCloseButtons;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

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

public class TPMain extends JFrame
{
	public static void main(String[] args)
	{
		new TPMain();
	}
	
	public TPMain()
	{
		JTabbedPane tp = new JTabbedPane();
		
		JPanel panel = new JPanel();
	    panel.setOpaque(false);
	    tp.add(panel);
	    tp.setTabComponentAt(tp.indexOfComponent(panel), new HeaderPanel(tp, panel, "Tab1"));

	    JPanel panel1 = new JPanel();
	    panel1.setOpaque(false);
	    tp.add(panel1);
	    tp.setTabComponentAt(tp.indexOfComponent(panel1), new HeaderPanel(tp, panel1, "Tab2"));

	    JPanel panel2 = new JPanel();
	    panel2.setOpaque(false);
	    tp.add(panel2);
	    tp.setTabComponentAt(tp.indexOfComponent(panel2), new HeaderPanel(tp, panel2, "Tab3"));

	    JPanel panel3 = new JPanel();
	    panel3.setOpaque(false);
	    tp.add(panel3);
	    tp.setTabComponentAt(tp.indexOfComponent(panel3), new HeaderPanel(tp, panel3, "Tab4"));
		
	    this.add(tp, BorderLayout.CENTER);
	    this.setSize(500,500);
		this.setVisible(true);
	}

	private class HeaderPanel extends JPanel
	{
		private JTabbedPane parent;
		private JPanel contentPanel;
		
		private AbstractAction deleteTabAction = new AbstractAction("X")
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				if (HeaderPanel.this.parent != null)
				{
					for (int i=0; i<HeaderPanel.this.parent.getTabCount(); i++)
					{
						if (HeaderPanel.this.parent.getComponentAt(i) == contentPanel)
						{
							System.out.println("Found the related tab, remove it!");
							HeaderPanel.this.parent.removeTabAt(i);
						}
					}
				}
			}
		};
		
		public HeaderPanel(JTabbedPane parent, JPanel contentPanel, String title)
		{
			this.parent = parent;
			this.contentPanel = contentPanel; 
			
			this.setLayout(new FlowLayout());
			this.add(new JLabel(title));
			this.add(new JButton(deleteTabAction));
			this.setOpaque(false);
		}
	}
}
 
hey,

danke noch für deine Antwort. Ein Kollege hat mir ein Demo erstellt, vll hilft das noch anderen in der Zukunft:

Java:
package TestFiles;

import java.awt.BorderLayout;
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;
import javax.swing.border.EmptyBorder;

public class TabsTester extends JFrame {
	// -------------------------------------------
	// Programm starten
	// -------------------------------------------
	public static void main(String[] args) {
		new TabsTester();
	}

	// -------------------------------------------
	// Dialogelemente erzeugen
	// -------------------------------------------
	private JTabbedPane mypane= new JTabbedPane();
	private JButton btnNew = new JButton("add Tab!");
	
	// -------------------------------------------
	// Konstruktor (baut GUI auf)
	// -------------------------------------------
	public TabsTester() {
		// ------------------------------
		// Event Listener
		// ------------------------------
		btnNew.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				JPanel newTab = new JPanel();
				newTab.add(new JLabel("xxx"+Math.random()));
				
				String title = "Tab "+(int)(Math.random()*100);
				MyTabHeader header = new MyTabHeader(title, mypane);
				int i = mypane.getTabCount();
				mypane.addTab("", newTab);
				mypane.setTabComponentAt(i, header);
			}
		});
		// ------------------------------
		// Dialogelemente plazieren
		// ------------------------------
		JPanel mainPanel = new JPanel(new BorderLayout(20,20));
		mainPanel.setBorder(new EmptyBorder(20, 20, 20, 20));
		mainPanel.add(mypane, BorderLayout.CENTER);
		mainPanel.add(btnNew, BorderLayout.SOUTH);
		
		btnNew.doClick();
		btnNew.doClick();
		btnNew.doClick();
		// ------------------------------
		// Fenster konfigurieren
		// ------------------------------
		add(mainPanel);
		setSize(500, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setTitle("TabsTester");
		setVisible(true);
	}

	// -------------------------------------------
	// Klasse MyTabHeader
	// -------------------------------------------
	private class MyTabHeader extends JPanel{
		private JLabel label = new JLabel("");
		private JButton button = new JButton("x");
		private JTabbedPane tabpane;
		private JPanel thispanel = this;
		public MyTabHeader(String title,JTabbedPane pane){
			super();
			label.setText(title);
			tabpane=pane;
			add(label);
			add(button);
			
			button.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					int i = tabpane.indexOfTabComponent(thispanel);
					 if (i != -1) {
	                tabpane.remove(i);
	            }
				}
			});
		}
		
	}
	
}// class
 

Zurück
Oben