Swing JTabbedPane: Zur Laufzeit die Tabreihenfolge ändern

fuggl

Mitglied
Hallo werte Programmierkollegen/Innen,

ich würde gerne die Tabreihenfolge zur Laufzeit ändern können, doch leider ist die Drag&Drop-Unterstützung für die Klasse JTabbedPane quasi nicht vorhanden.
Also habe ich einen MouseListener und MouseMotionListener geschrieben (siehe unten). Eigentlich keine große Sache.. EIGENTLICH. Leider funktioniert es zwar soweit, aber wenn ich ein bisschen herumprobiere, verschwindet zwischendurch immer mal ein Tab, wird einfach gelöscht! Liegt vielleicht an der Methode insertTab() bzw. an dem "Vector", in dem die Tabs gespeichert werden. Keine Ahnung. Aber das darf im Programm auf keinen Fall vorkommen!

Hat jemand von euch eine Idee, wie ich das verhindern kann? Mein Quelltext sieht -nach vielen Versuchen- so aus:
(Es handelt sich übrigens um einen normalen JTabbedPane mit eigenen, von JPanel abgeleiteten Komponenten, also nichts besonderes.)

Java:
package events;

import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.Icon;
import javax.swing.JTabbedPane;

public class TabDragAndDrop implements MouseMotionListener, MouseListener {

	private int			draggedIndex = -1;
	private Component	draggedComp;
	private String		draggedtitle;
	private String		draggedTipText;
	private Icon		draggedIcon;
	
	@Override
	public void mouseDragged(MouseEvent e) {
		JTabbedPane pane = (JTabbedPane)e.getComponent();
		int index = pane.indexAtLocation(e.getPoint().x, e.getPoint().y);
		if(index < 0) return;
		if(this.draggedIndex < 0){
			this.draggedIndex	= index;
			this.draggedComp	= pane.getComponent(index);
			this.draggedtitle	= pane.getTitleAt(index);
			this.draggedTipText	= pane.getToolTipTextAt(index);
			this.draggedIcon	= pane.getIconAt(index);
		}
		else {
			pane.setSelectedIndex(index);
		}
	}

	@Override
	public void mouseMoved(MouseEvent e) {
	}
	@Override
	public void mouseClicked(MouseEvent e) {
	}
	@Override
	public void mouseEntered(MouseEvent e) {
	}
	@Override
	public void mouseExited(MouseEvent e) {
	}
	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		if(e.getButton() != MouseEvent.BUTTON1 || this.draggedIndex < 0) return;
		JTabbedPane pane = (JTabbedPane)e.getComponent();
		int dropIndex = pane.indexAtLocation(e.getPoint().x, e.getPoint().y);
		if(dropIndex < 0 || dropIndex == this.draggedIndex) {
			this.draggedIndex = -1;
			return;
		}
		pane.remove(this.draggedIndex);
		if(this.draggedIndex > dropIndex) dropIndex++;
		pane.insertTab(this.draggedtitle, this.draggedIcon, 
				this.draggedComp, this.draggedTipText, dropIndex);
		this.draggedIndex = -1;
	}

}


Danke schonmal im Voraus.
 

Zurück
Oben