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

    Creare componenti dinamicamente

    Ciao a tutti,
    Come da titolo chiedo il vostro aiuto su come fare, se possibile, a creare dinamicamente oggetti Java, in particolare oggetti come JLabel, JPanel, ecc.
    Io ho una classe dovre creo un metodo:

    codice:
    public class makeGUI extends JFrame{      
    
    JFrame newframe = new JFrame();      
    public makeGUI(String title, int w, int l){          
    newframe.setSize(1024, 768);         newframe.setDefaultCloseOperation(EXIT_ON_CLOSE);          
    //Questo serve per adattare il frame ai contenuti esistenti         
    //newframe.pack();          
    newframe.setVisible(true);              
    }          
    
    void addComponents(String className, String name, String text) {
    try{                          
    Class cl = Class.forName(className);             
    Object object = cl.newInstance();
                                                                    
    javax.swing.JComponent component = (javax.swing.JComponent)object;
    component.setName(name);   
    //if(component.equals(object)){                               
    JPanel panel = new JPanel();
    //panel.add(component);                 
    newframe.getContentPane().add(component);              
    //}          
    } catch (Exception exc) {              
    System.out.println(exc);
    }                
    }
    Come da codice, io vorrei che quando richiamo addComponent(), passandogli come parametro la classe (per es. javax.swing.JLabel) lui mi ricavi l'oggetto dalla classe.
    E' possibile secondo voi?
    Grazie mille,
    Gabriele

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

    Re: Creare componenti dinamicamente

    Originariamente inviato da programmerxx89
    io vorrei che quando richiamo addComponent(), passandogli come parametro la classe (per es. javax.swing.JLabel) lui mi ricavi l'oggetto dalla classe.
    E' possibile secondo voi?
    Non vedo alcun problema particolare. Tra l'altro tutti i componenti AWT/Swing hanno come minimo il costruttore no-args (senza argomenti).
    Il punto è solo un altro: se vuoi aggiungere il nuovo componente dentro un contenitore quando questo contenitore è già visibile devi: a) se usa un layout manager rivalidare il layout, b) se non usa un layout manager basta un repaint.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la risposta.
    Il problema è che io ho la necessità di utilizzare Object come, per esempio, JLabel: vorrei ricavare i metodi di JLabel ed implementarli in Object, in modo tale da poter attruibuire un testo, per esempio, al metodo setText().
    spero di essere stato abbastanza chiaro.
    Gabriele

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da programmerxx89
    per esempio, JLabel: vorrei ricavare i metodi di JLabel ed implementarli in Object
    Detto così mi spiace ma non vuol dire proprio nulla .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Detto così mi spiace ma non vuol dire proprio nulla .....
    ok scusami cerco di spiegarmi meglio: praticamente io passo ad addComponents() la classe (es. javax.swing.JLabel) come stringa, il nome e il testo (che vorrei attruibire all'oggetto che si creerà dalla classe che gli passo) sempre come stringa.
    Fatto ciò, praticamente io vorrei, se fosse possibile, che quando istanzio object con la classe che gli ho passato, lui mi peschi tutti i metodi associati alla classe stessa.
    es. Object.setText("asd"); -> avendogli passato la classe javax.swing.JLabel.
    perchè ovviamente object è generico e non ha un metodo come quello sopra.
    Sono alle prime armi con Java, quindi ti chiedo scusa se chiedo cose impossibili.

    grazie mille per l'attenzione,
    Gabriele

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da programmerxx89
    ok scusami cerco di spiegarmi meglio: praticamente io passo ad addComponents() la classe (es. javax.swing.JLabel) come stringa, il nome e il testo (che vorrei attruibire all'oggetto che si creerà dalla classe che gli passo) sempre come stringa.
    Fatto ciò, praticamente io vorrei, se fosse possibile, che quando istanzio object con la classe che gli ho passato, lui mi peschi tutti i metodi associati alla classe stessa.
    es. Object.setText("asd"); -> avendogli passato la classe javax.swing.JLabel.
    perchè ovviamente object è generico e non ha un metodo come quello sopra.
    Il punto è innanzitutto "concettuale". Passando un nome di classe, il tipo di componente non è noto a priori, nel senso che dipende appunto da chi/come sceglie quale nome di classe passare.

    Il newInstance ti dà un Object in senso generico, certo. Tu potresti anche fare un cast, ad esempio a Component (la "base" di tutti i componenti).
    Per setName non ci sarebbero problemi ... è di Component cioè la proprietà "name" esiste per tutti i componenti, è generica.
    Per setText .... no. Va bene per un JLabel o JButton o JTextField ma non ad esempio per JComboBox, JList.

    Quindi o mi spieghi perché vuoi creare un componente che "non sai" ma volendo settare un "text" (che non sai a priori se possibile) oppure l'unica che posso risponderti è di usare la "reflection" (e se non direttamente, anche attraverso le classi del package java.beans, dedicato appunto ai "bean").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    Il punto è innanzitutto "concettuale". Passando un nome di classe, il tipo di componente non è noto a priori, nel senso che dipende appunto da chi/come sceglie quale nome di classe passare.

    Il newInstance ti dà un Object in senso generico, certo. Tu potresti anche fare un cast, ad esempio a Component (la "base" di tutti i componenti).
    Per setName non ci sarebbero problemi ... è di Component cioè la proprietà "name" esiste per tutti i componenti, è generica.
    Per setText .... no. Va bene per un JLabel o JButton o JTextField ma non ad esempio per JComboBox, JList.

    Quindi o mi spieghi perché vuoi creare un componente che "non sai" ma volendo settare un "text" (che non sai a priori se possibile) oppure l'unica che posso risponderti è di usare la "reflection" (e se non direttamente, anche attraverso le classi del package java.beans, dedicato appunto ai "bean").
    Vorrei aggiungere qualsiasi componente richiamando nel main solo addComponents(). quindi in altre parole adottare un inserimento dinamico. esempio: addComponents(JLabel) o addComponents(JPanel) o addComponents(JButton), ecc. Ovviamente addComponents() dovrà ricavare un oggetto generico perchè non sa a priori che tipo di oggetto io gli passo, di conseguenza vorrei che addComponents() capisca che tipo di oggetto è (magari tramite classe, o qualsiasi altra cosa) e ne attribuisca i metodi appriopriati. Ribadisco: sempre se è possibile.
    Grazie mille,
    Gabriele

  8. #8
    Come ti ha già fatto notare andbin l'unica è utilizzare la reflection tramite la quale è possibile ispezionare un oggetto e ricavarne i metodi, ma è sicuramente un processo lungo e poco performante. Secondo me ti stai incartando, devi mettere dei paletti e decidere quale tipo di oggetti passare al metodo addComponents(). Ciò che vuoi fare tu, secondo me, è troppo generico.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  9. #9
    Originariamente inviato da satifal
    Come ti ha già fatto notare andbin l'unica è utilizzare la reflection tramite la quale è possibile ispezionare un oggetto e ricavarne i metodi, ma è sicuramente un processo lungo e poco performante. Secondo me ti stai incartando, devi mettere dei paletti e decidere quale tipo di oggetti passare al metodo addComponents(). Ciò che vuoi fare tu, secondo me, è troppo generico.
    Ciao satifal,
    Grazie della risposta. Capisco... Quindi ti chiedo, secondo te, come potrei adattare il codice per ottenere una soluzione il più dinamica possibile?
    Grazie,
    Gabriele

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.