[SWT] Widget abgeleitet und nun ClassCastException

AceTheFace

Mitglied
Hallo,

versuche mich gerade zum Einarbeiten in SWT/Java an einem kleinen IRC-Client. Nun möchte ich für die einzelnen Channels Tabs benutzen.
Dazu habe ich mir von CTabItem eine Klasse ChannelTab abgeleitet, die so aussieht:

Java:
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;

public class ChannelTab extends CTabItem {
	private int id;
	private String name;
	private StyledText textArea;
	private boolean isServer;
	private ChannelTab parent;
	
	public ChannelTab(CTabFolder tabFolder,String name, int id, boolean server, ChannelTab parent) {
		super(tabFolder,SWT.NONE);
		this.name = name;
		this.id = id;
		this.setText(name);
		this.isServer=server;
		this.parent = parent;
		GridData g = new GridData(GridData.FILL_BOTH);
		//create TextArea
		textArea = new StyledText(tabFolder,SWT.FULL_SELECTION|SWT.READ_ONLY|SWT.WRAP|SWT.V_SCROLL);
		textArea.setCursor(null);
		textArea.setToolTipText("Gelaber im Channel");
		this.setControl(textArea);
		tabFolder.setLayoutData(g);
	}
	
	protected void checkSubclass() {
    }

	public String getName() {
		return name;
	}
	
	public int getID() {
		return id;
	}
	
	public void appendText(String msg) {
		textArea.append(msg);
		textArea.setTopIndex(textArea.getLineCount()-1);
	}
	
	public boolean isServer() {
		return isServer;
	}
	
	public ChannelTab getParentTab() {
		return parent;
	}
}

In meinem Hauptfenster benutze ich nun ein CTabFolder als Container für die ChannelTabs.
Nun möchte ich immer das aktive Tab speichern. Dazu habe ich folgendes gemacht:

Java:
//create TabFolder, active vom Typ Channeltab
		tabFolder = new CTabFolder(shell,SWT.BORDER);
		//merke aktives Tab
		tabFolder.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				active = (ChannelTab) tabFolder.getSelection(); 
			}
		});

In der Zeile "active = (ChannelTab) tabFolder.getSelection();" bekomme ich nun immer eine ClassCastException.
Zum Debuggen habe ich mal folgendes gemacht:

Java:
//create TabFolder
		tabFolder = new CTabFolder(shell,SWT.BORDER);
		//merke aktives Tab
		tabFolder.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				CTabItem tab = tabFolder.getSelection();
				if(tab instanceof ChannelTab)
					active = (ChannelTab) tab;
				else System.out.println(tab.getClass().toString());
			}
		});

Und siehe da, die getSelection()-Methode gibt mir eben ein CTabItem zurück.
Wie schaffe ich das trotzdem? Muss ich mir auch noch ein eigenes TabFolder ableiten?

Gruß,
Ace
 
Zuletzt bearbeitet:
Moin,
nein, musst Du nicht. Du musst lediglich auf Deine Klasse casten - zumindest sieht das für mich so aus. Ich nehme an, dass die getSelection()-Methode ein CTabItem zurückgibt. Das ist wohl so, den Rückgabetyp wirst Du kaum ändern können. Also nimm das CTabItem, prüfe dann mit instanceof und caste auf Deine Klasse. Also so, wie Du es für die Debugausgabe schon getan hast. Eine andere Möglichkeit gibt es m.W. nicht. Aber wozu auch, wenn es so funktioniert.
 
Snape hat gesagt.:
Moin,
nein, musst Du nicht. Du musst lediglich auf Deine Klasse casten - zumindest sieht das für mich so aus. Ich nehme an, dass die getSelection()-Methode ein CTabItem zurückgibt. Das ist wohl so, den Rückgabetyp wirst Du kaum ändern können. Also nimm das CTabItem, prüfe dann mit instanceof und caste auf Deine Klasse. Also so, wie Du es für die Debugausgabe schon getan hast. Eine andere Möglichkeit gibt es m.W. nicht. Aber wozu auch, wenn es so funktioniert.

Na ich versuche ja einfach zu casten: "active = (ChannelTab) tabFolder.getSelection();"
Aber da kommt es ja zu der Exception.

Gruß,
Ace
 
immer schön den API vertrag beachten!

/**
* Instances of this class represent a selectable user interface object
* that represent a page in a notebook widget.
*
* <dl>
* <dt><b>Styles:</b></dt>
* <dd>SWT.CLOSE</dd>
* <dt><b>Events:</b></dt>
* <dd>(none)</dd>
* </dl>
* <p>
* IMPORTANT: This class is <em>not</em> intended to be subclassed.
* </p>
*/
public class CTabItem extends Item {
 

Neue Beiträge

Zurück