Anzeige:
Ergebnis 1 bis 7 von 7

Thema: [SWT] Widget abgeleitet und nun ClassCastException

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71

    [SWT] Widget abgeleitet und nun ClassCastException

    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:

    Code:
    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:

    Code:
    //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:

    Code:
    //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

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Kommt er denn bei deinem Debugcode mal beim else vorbei?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Zitat Zitat von peschmae
    Kommt er denn bei deinem Debugcode mal beim else vorbei?

    MfG Peschmä
    Ja klar, er geht immer in "else", da getSelection ja ein CTabItem zurückliefert.

    Gruß,
    Ace

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Achso, da hatte ich was falsch verstanden

    In C++ wäre das jetzt wohl ein klassischer fall von Slicing. Aber ich dachte in Java gibts das nicht. Sind ja alles Referenzen/Pointer/wie man dem auch immer sagt.

    Andere Anmerkung die mit dem konkreten Problem wohl auch nichts zu tun hat: Normalerweise kann/darf man nicht von SWT-Klassen ableiten. Zumindest war das mal so (mit ein oder zwei Ausnahmen).

    MfG Peschmä
    Geändert von peschmae (23-05-2006 um 18:06 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Zitat Zitat von peschmae
    Achso, da hatte ich was falsch verstanden

    In C++ wäre das jetzt wohl ein klassischer fall von Slicing. Aber ich dachte in Java gibts das nicht.

    Andere Anmerkung die mit dem konkreten Problem wohl auch nichts zu tun hat: Normalerweise kann/darf man nicht von SWT-Klassen ableiten. Zumindest war das mal so (mit ein oder zwei Ausnahmen).

    MfG Peschmä
    Ja, das habe ich auch gelesen. Damit das überhaupt funktioniert muss man auch die "protected void checkSubclass()" überschreiben.
    Hm, dann wäre es wohl besser wenn ich das ganze Konzept nochmal überdenke.....na ja mal schauen.

    Gruß,
    Ace

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ach, stimmt, das hast du gemacht. Ich hatte mich schon gefragt wieso das geht und ob etwa ein SWT-Chefentwickler von der Erleuchtung heimgesucht worden sei

    Eventuell läufts halt mehr in Richtung von einer Klasse mit dem Tab als private Member oder so.
    Irgend ein Design Pattern um das Problem definitv zu erschlagen wirst du sicher finden

    Ich hab mich dann mal glaub ich auch auf so Tricksereien mit dem data()-Memberfunktionsdings das alle SWT Klassen haben verlegt. Das ist aber recht unschön.

    Naja, schlussendlich hab ich das mit SWT dann wieder gelassen nach meiner Maturarbeit. War zwar nett aber irgendwie hat mich Qt mehr überzeugt. C++ ist zwar nicht soo meine Lieblingssprache aber ich finde die Api von Qt gut durchdacht und man kann Ableiten
    Das heisst jetzt natürlich nicht dass ich dir SWT ausreden will oder so, auch wenn du mich jetzt gerade dabei erwischt hast...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Ich werde einfach noch mal drüber schlafen und in mich gehen

    Java ist halt meine "Hauptsprache", von daher würde ich da schon gerne bei bleiben. Und Swing-GUIs gefallen mir überhaupt nicht, deswegen dachte ich mal daran SWT zu probieren.
    QT ist auch ganz hübsch, allerdings müsste ich da erstmal wieder mein C++-Buch aus dem Regal ziehen und abstauben

    Gruß,
    Ace

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •