Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Java casting ad Interfaccia

    Ciao a tutti! avrei una questione da porre: ho un JTabbed pane nel quale si aggiungono varie TAB, ognuna è una classe che estende JPane e d implementa una interfaccia da me creata: InterfacePanel che contiene un metodo Save().

    A questo punto io prendo tutte le tab con central_panel.getTabComponentAt(i) ma non riesco a fare il casting all'interfaccia InterfacePanel per usare suddetto metodo.
    codice:
    Utility.FunctionsGUI.InterfacePanel B = (Utility.FunctionsGUI.InterfacePanel)central_panel.getTabComponentAt(i);
    B.Save();
    Vorrei sapere dove sbaglio
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lory1990 Visualizza il messaggio
    A questo punto io prendo tutte le tab con central_panel.getTabComponentAt(i) ma non riesco a fare il casting all'interfaccia InterfacePanel per usare suddetto metodo.
    codice:
    Utility.FunctionsGUI.InterfacePanel B = (Utility.FunctionsGUI.InterfacePanel)central_panel.getTabComponentAt(i);
    B.Save();
    Vorrei sapere dove sbaglio
    Concettualmente non c'è (e non vedo) niente di sbagliato. Se il Component i-esimo nel JTabbedPane è realmente una istanza del TuoPannello che implementa InterfacePanel, allora il cast è valido e a runtime non deve certo fallire.

    In generale un cast da una classe ad una interfaccia è sempre accettato dal compilatore (cosa poi succede a runtime è un altro discorso) tranne nel caso particolare in cui la classe è final e non implementa quella interfaccia (perché il compilatore può già provare a priori che il cast non avrebbe senso e fallirebbe sempre).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Concettualmente non c'è (e non vedo) niente di sbagliato. Se il Component i-esimo nel JTabbedPane è realmente una istanza del TuoPannello che implementa InterfacePanel, allora il cast è valido e a runtime non deve certo fallire.

    In generale un cast da una classe ad una interfaccia è sempre accettato dal compilatore (cosa poi succede a runtime è un altro discorso) tranne nel caso particolare in cui la classe è final e non implementa quella interfaccia (perché il compilatore può già provare a priori che il cast non avrebbe senso e fallirebbe sempre).
    Esattamente, per esempio io aggiungo al TAB questa classe:

    codice:
    public class IN_Main extends javax.swing.JPanel implements Utility.FunctionsGUI.InterfacePanel
    poi quando vado a fare il casting ottengo questo errore:
    codice:
    java.lang.ClassCastException: Hull.IN_Main$1 cannot be cast to Utility.FunctionsGUI.InterfacePanel
    La cosa interessante è che il comando
    codice:
    getTabComponentAt(i).getClass().getInterfaces()
    restituisce un array vuoto ma il nome della classe e la collocazione nel progetto sono corretti

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lory1990 Visualizza il messaggio
    codice:
    public class IN_Main extends javax.swing.JPanel implements Utility.FunctionsGUI.InterfacePanel
    Ok, IN_Main implementa InterfacePanel, su questo non c'è dubbio, almeno per quanto si può vedere qui.

    Quote Originariamente inviata da Lory1990 Visualizza il messaggio
    poi quando vado a fare il casting ottengo questo errore:
    java.lang.ClassCastException: Hull.IN_Main$1 cannot be cast to Utility.FunctionsGUI.InterfacePanel
    Alt!!! La istanza non è di IN_Main ma di una anonymous inner class contenuta dentro IN_Main. Quindi verifica bene cosa viene istanziato e passato nel JTabbedPane (puoi farlo solo tu ... non io, non potendo vedere il codice completo).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, IN_Main implementa InterfacePanel, su questo non c'è dubbio, almeno per quanto si può vedere qui.


    Alt!!! La istanza non è di IN_Main ma di una anonymous inner class contenuta dentro IN_Main. Quindi verifica bene cosa viene istanziato e passato nel JTabbedPane (puoi farlo solo tu ... non io, non potendo vedere il codice completo).
    Capisco, beh il codice che aggiunge al TAB principale la mia classe è contenuto in IN_Main ed è questo:
    codice:
    Main.IN_Main.central_panel.add(name,this);  // Aggiunge IN_Main
    // Aggiunge una spunta tipo X per chiudere il tab
            ButtonTabComponent BTC = new ButtonTabComponent(Main.IN_Main.central_panel,language.getString("HULL")) {
                @Override
                public int SaveAll() {
                    return Save(true);
                }
            };
            int i = Main.IN_Main.central_panel.getTabCount()-1;
            Main.IN_Main.central_panel.setTabComponentAt(i, BTC);
            Main.IN_Main.central_panel.setSelectedIndex(i);
    ma il comando central_panel.getTabComponentAt(i).getClass(); ritorna Hull.IN_Main$1

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lory1990 Visualizza il messaggio
    ma il comando central_panel.getTabComponentAt(i).getClass(); ritorna Hull.IN_Main$1
    Infatti ... a setTabComponentAt viene passato BTC che fa riferimento ad un oggetto che è la istanza della anonymous inner class che estende ButtonTabComponent.
    ButtonTabComponent implementa InterfacePanel? Direi proprio di no, visto che appunto il cast fallisce.

    In sostanza, nel tabbed pane c'è un ButtonTabComponent (con in più il SaveAll ridefinito) .... non un IN_Main.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Aia! e se io volessi prendere IN_Main !? c'è qualche modo?

    EDIT: OK ho capito, basta invocare getComponentAt e non getTabComponentAt
    Ultima modifica di Lory1990; 19-04-2014 a 12:26

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Alt ..... un momento, io non so esattamente cosa stai cercando di fare in generale ma .... getTabComponentAt/setTabComponentAt non è per il componente che occupa lo spazio "condiviso" nel JTabbedPane. get/setTabComponentAt gestiscono (è una feature da Java 6) il componente che sostituisce il "titolo" del componente, in pratica quello che si vede sulla "linguetta" della scheda.

    Se vuoi il componente nella scheda (e non sulla linguetta), questo è da get/setComponentAt.
    Quindi presumo che a te interessa quest'ultimo .... non quello sulla linguetta!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Si si a me serve il componente "dentro" il tab, non sulla linguetta, praticamente sto realizzando un programma di Ingegneria che fa vari calcoli, quando si chiama una routine questa si mostra nel JTabbedPane sotto forma di TAB. Purtroppo durante il salvataggio se non salvo ogni calcolo singolarmente perdo i dati e quindi ho pensato di farli salvare tutti insieme quando clicco su save

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.