Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    [Java] Castare da una sottoclasse nella classe passata dall'utente

    Ciao a tutti,

    Il titolo non è molto chiaro..cercherò di venire subito al dunque.

    Utilizzo dei riferimenti JPanel nel mio software. Se viene passata una sottoclasse di JPanel il software deve essere in grado di castare l'oggetto (JPanel, ottenuto tramite una chiamata ad un metodo) nel tipo fornito dal programmatore...

    Più che un software è una specie di raccolta di funzioni, e non saprei come lasciare al programmatore la libertà di chiamare la funzione desiderata nella sua classe (purchè questa estenda JPanel).

    Spero di essermi spiegato, in caso contrario cercherò di rispiegare meglio

  2. #2

    Re: [Java] Castare da una sottoclasse nella classe passata dall'utente

    Originariamente inviato da Patrick Jane
    Ciao a tutti,

    Il titolo non è molto chiaro..cercherò di venire subito al dunque.

    Utilizzo dei riferimenti JPanel nel mio software. Se viene passata una sottoclasse di JPanel il software deve essere in grado di castare l'oggetto (JPanel, ottenuto tramite una chiamata ad un metodo) nel tipo fornito dal programmatore...

    Più che un software è una specie di raccolta di funzioni, e non saprei come lasciare al programmatore la libertà di chiamare la funzione desiderata nella sua classe (purchè questa estenda JPanel).

    Spero di essermi spiegato, in caso contrario cercherò di rispiegare meglio
    Non ho capito bene! Per caso vuoi sapere come passare da un tipo all'altro mediante Cast a run time?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Castare da una sottoclasse nella classe passata dall'utente

    Originariamente inviato da Patrick Jane
    Utilizzo dei riferimenti JPanel nel mio software. Se viene passata una sottoclasse di JPanel il software deve essere in grado di castare l'oggetto (JPanel, ottenuto tramite una chiamata ad un metodo) nel tipo fornito dal programmatore...
    Dato un reference JPanel, fare un downcast ad un es. MioPannello (che chiaramente deve estendere JPanel)? Perfettamente possibile (lecito per il compilatore) ... cosa poi succeda a runtime è un altro discorso.

    Originariamente inviato da Patrick Jane
    Più che un software è una specie di raccolta di funzioni, e non saprei come lasciare al programmatore la libertà di chiamare la funzione desiderata nella sua classe (purchè questa estenda JPanel).

    Spero di essermi spiegato, in caso contrario cercherò di rispiegare meglio
    Ehm, non più di tanto. Ripeto: un downcast (purché lecito per il compilatore) è possibile. Ma cosa vuoi fare non è molto chiaro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Grazie per le risposte!

    In pratica ho una classe che estende JPanel. Questa ha un metodo che riceve come parametro una sottoclasse di JPanel (quindi deve essere una classe che extends JPanel). La classe che passo come parametro contiene (nel mio caso specifico) 2 campi di testo (sulla stessa riga). Quindi in sostanza, creerei N righe, come fosse una JTable.

    Questa classe che fa un pò da "JTable" deve ovviamente, poter mostrare i dati ottenuti nei campi di testo che contiene (ovviamente, ogni riga corrisponde ad un JPanel diverso; i JPanel li memorizzo in un ArrayList)..per far ciò uso come riga l'indice dell'array (così da ottenere il panel) e come colonna andrei a richiamare il campo stesso.

    Qui sorge il primo problema... io per renderla "generale" manipolo dei JPanel (ho evitato Object pensando di "circoscrivere" gli oggetti che si possono passare, evitando usare poi i Generics)..se in questa classe ho un metodo getText() come posso castare il JPanel nella classe passata dal programmatore così da richiamare getText()?

    Spero di essere stato più chiaro!

    Grazie a tutti! ^^

  5. #5
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    non ho capito molto...da quello che ho capito io hai
    ClasseA extends JPanel e vorresti utilizzare su ClasseA i metodi di JPanel facendo il cast...corretto?
    Se sì, non capisco a cosa serva il cast dato che ClasseA ha sicuramente disponibili tutti i metodi di JPanel in quanto sua estensione
    forse con due righe di codice sarebbe tutto pià chiaro

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  6. #6
    Originariamente inviato da Patrick Jane
    Grazie per le risposte!

    In pratica ho una classe che estende JPanel. Questa ha un metodo che riceve come parametro una sottoclasse di JPanel (quindi deve essere una classe che extends JPanel). La classe che passo come parametro contiene (nel mio caso specifico) 2 campi di testo (sulla stessa riga). Quindi in sostanza, creerei N righe, come fosse una JTable.

    Questa classe che fa un pò da "JTable" deve ovviamente, poter mostrare i dati ottenuti nei campi di testo che contiene (ovviamente, ogni riga corrisponde ad un JPanel diverso; i JPanel li memorizzo in un ArrayList)..per far ciò uso come riga l'indice dell'array (così da ottenere il panel) e come colonna andrei a richiamare il campo stesso.

    Qui sorge il primo problema... io per renderla "generale" manipolo dei JPanel (ho evitato Object pensando di "circoscrivere" gli oggetti che si possono passare, evitando usare poi i Generics)..se in questa classe ho un metodo getText() come posso castare il JPanel nella classe passata dal programmatore così da richiamare getText()?

    Spero di essere stato più chiaro!

    Grazie a tutti! ^^
    Io ti consiglio di definirti una sottoclasse di JTextComponent anzichè di JPanel!

    Questa classe a differenza del JComponent, superclasse di JPanel che a sua volta non è una sottoclasse di JTextComponent, ha a disposizione il metodo getText()...(chiaro che non è l'unica differenza).
    Quindi avresti questa sorta di JTable costituita da istanze che sicuramente contengono campi di testo e puoi tranquillamente invocare su di essere il metodo getText() qualsiasi sia la loro classe di appartenenza (purchè si tratti di istanze della classe JTextComponent o di una sua sottoclasse, ma questo è compito del compilatore stabilirlo);
    trattandosi di sottoclassi di JTextComponent sei sicuro che quelle istanze vengono modellate come pannelli che contengono testi!

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    @oronze: no, se fosse stato così semplice non avrei avuto problemi :P

    @VincenzoTheBest: il getText() doveva essere solo un esempio ^^ (si, ho scelto il nome sbagliato).
    Immaginate una situazione di questo tipo:
    codice:
    // class Riga extends JPanel
    Riga() {
      // Contiene i JTextField; nel mio caso ad esempio ne ho 2 affiancati
    }
    // Metodi getter/setter della classe Riga!
    codice:
    // classe A extends JPanel
    addRow(JPanel panel) {
      // Qui il codice...
    
      // aggiungo il panel passato a questo pannello
      add(panel);
    }
    
    getValueAt(int riga, int colonna) {
      // ArrayList array
      ((CLASSE_DA_CASTARE)array.get(riga).getIndirizzo());
    }
    codice:
    // classe B extends JPanel
    A a = new A();
    a.addRow(new Riga());
    Il mio problema è nella classe A, precisamente al metodo getValueAt()..io li dovrei richiamare getIndirizzo() che si trova in Riga (in questo caso)..ma se la classe fosse un altra? Come posso castarlo al tipo Riga senza dover mettere Riga tra parentesi ed effettuare il cast?

    All'inizio avevo pensato che la classe Class potesse aiutarmi...ma i tentativi sono stati vani, lascio la parola a voi.

  8. #8
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    ora forse è un po' più chiaro...e se tu facessi qualcosa del genere
    codice:
    class Indirizzo extends JPanel{
    ...
    getIndirizzo()
    ..
    }
    class Riga1 extends Indirizzo{}
    class Riga2 extends Indirizzo{}
    oppure
    codice:
    interface Indirizzo{
    getIndirizzo(){}
    }
    class Riga1 extends JPanel implements Indirizzo{}
    class Riga2 extends JPanel implements Indirizzo{}
    e poi ovviamente casti per Indirizzo
    potrebbe essere una soluzione?

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    No, non cambierebbe nulla...poichè, di default utilizzerei Riga. Ma se tu hai bisogno di una tua implementazione, ad esempio estendendo Riga, quello non può funzionare..poichè utilizzando un JPanel non vi sono abbastanza informazioni per chiamare un oggetto Riga, che è una sua sottoclasse.

  10. #10
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    Originariamente inviato da Patrick Jane
    No, non cambierebbe nulla...poichè, di default utilizzerei Riga. Ma se tu hai bisogno di una tua implementazione, ad esempio estendendo Riga, quello non può funzionare..poichè utilizzando un JPanel non vi sono abbastanza informazioni per chiamare un oggetto Riga, che è una sua sottoclasse.
    continuo a non capire...sarà che sono rinc... in questo periodo ma...
    se io prendo le tue classi, vado ad estendere riga ottengo una gerarchia del tipo
    ...->JPanel->Riga->MioOggetto e, castando in getValueAt a Riga, non capisco perchè nn debba funzionare

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.