Ciao!
Allora... come hai gia' detto anche tu, in questo caso l'implementazione dell'ereditarieta' va fatta su classi create da te e non da quelle gia' esistenti.
Questo e' anche abbastanza normale per l'interfaccia grafica di un progetto "didattico" ed effettivamente anche io troverei due obiezioni ad una tale implementazione e cerchero' di spiegarti quali sono:
1) Perche' estendere un JPanel (a cui dovrai aggiungere gli elementi per l'editing del testo) e successivamente aggiungerlo al contentPane del JFrame principale?
Per il principio del "keep it simple" ("facciamo le cose facili!") puoi direttamente aggiungere il pannello al frame principale e su di esso fare add() degli elementi che vanno al suo interno, il tutto direttamente all'interno della classe che si occupa della gestione della GUI.
Il risultato per l'utente e' esattamente lo stesso, ma tu scrivi codice migliore.
2) La cosa piu' importante!!! Ok, estendendo un JPanel tutto funzionerebbe ugualmente, ma il principio su cui si basa l'ereditarieta' dove va a finire?
E' questo il motivo principale per cui ti hanno giustamente detto che non va bene se estendi un JPanel...
O meglio, nel tuo caso sarebbe tecnicamente fattibile ma concettualmente scorretto.
E veniamo quindi alla tua domanda: per implementare l'ereditarieta' all'interno della tua applicazione devi guardare lo schema delle classi che sicuramente ti sarai fatto prima di inizare a scrivere il codice e a questo punto individuare degli oggetti che abbiano alcune (ma non tutte!) proprieta' in comune e riunirle in una superclasse che le contenga.
I due (o piu') oggetti che prima condividevano parte delle stesse proprieta' o funzionalita' a questo punto saranno due oggetti che estendono la superclasse e che specificano al loro interno solo le proprieta' o le funzionalita' a loro peculiari.
Se guardando lo schema delle classi non trovi niente che possa essere generalizzato, il mio consiglio e' quello di inserire una funzionalita' aggiuntiva "mirata" a poter creare una situazione favorevole alla generalizzazione di due o piu' classi.
Per farti l'esempio classico che faccio sempre a lezione, prendi ad esempio una lavatrice e un televisore.
In comune hanno il fatto che sono due elettrodomestici che possono essere accesi, spenti e che necessitano di una alimentazione a 220V, quindi una buona superclasse sarebbe una chiamata Elettrodomestico, che contenga la variabile intera "tensione" e due metodi chiamati "accendi()" e "spegni()".
Le due sottoclassi sono Lavatrice e Televisore (che estendono Elettrodomestico) e che al loro interno contengono soltanto quelle variabili o metodi proprie della loro astrazione: ad esempio Lavatrice potrebbe avere i metodi "centrifuga()", "lavaDelicati()" e cosi' via, mentre Televisore potrebbe avere una variabile intera chiamata "numeroCanali" per i canali memorizzabili e un metodo "cambiaCanale()" che ti permette di passare da un canale memorizzato all'altro.
Tutto questo, basta tradurlo nei termini della tua applicazione e otterrai una implementazione di ereditarieta' corretta anche concettualmente.
Se dovessi essere stato poco chiaro o se hai bisogno di ulteriori chiarimenti, non esitare a scrivere!
Alessandro
--
Alessandro Fruchi
G@W -
http://www.guruatwork.comJugToscana -
http://www.jugtoscana.org