AceTheFace
23-05-2006, 14:51
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:
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_O NLY|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:
//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:
//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
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:
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_O NLY|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:
//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:
//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