Alexxandro ha scritto:
Praticamente fanno la stessa cosa.Cosi mi sembra di capire.
Premessa: JFrame è ben diverso dal Frame di AWT. JFrame ha una struttura più complessa, contiene innanzitutto un JRootPane il quale contiene a sua volta, tra altre cose, anche il "content pane" che è quello dove si inseriscono normalmente i componenti.
Questo è ben specificato nel javadoc di JFrame:
The JFrame class is slightly incompatible with Frame. Like all other JFC/Swing top-level containers, a JFrame contains a JRootPane as its only child. The content pane provided by the root pane should, as a rule, contain all the non-menu components displayed by the JFrame. This is different from the AWT Frame case.
Prima di Java 5, fare add sul JFrame e fare add sul content pane
erano due cose ben diverse e soltanto il add sul content pane era corretto per visualizzare componenti.
Da Java 5 hanno cambiato le cose e il add del JFrame fa semplicemente un "forward" (fa praticamente da "passacarte") verso il add del content pane.
Anche questo è ben specificato nel javadoc:
As a convenience, the add, remove, and setLayout methods of this class are overridden, so that they delegate calls to the corresponding methods of the ContentPane.
Quindi solo da Java 5 in poi, fare add sul JFrame o sul content pane è indifferente, entrambi fanno la cosa giusta.
Alexxandro ha scritto:
Ma dei due, quello che in teoria dovrebbe eseguire l'istrunzione, più velocemente , credo sia l'esempio A, che chiama solo la funzione add.
No. JFrame non ha quel add(Component), lo eredita dalle super-classi, per la precisione da java.awt.Container. Questo add di Container non "sa" nulla di preciso e invoca il addImpl che è protected e rappresenta il modo "interno" che i componenti hanno per ridefinire la aggiunta di un componente.
JFrame ridefinisce addImpl e all'inizio fa prima un controllo con isRootPaneCheckingEnabled() e solo se true (che è la norma) allora fa il forward sul content pane.
Quindi se mi parli di numero di invocazioni, allora this.getContentPane().add(Componente); è un pelino più efficiente, perché va più direttamente sul content pane.
Ma alla fin fine, la differenza anche ammesso che ci sia è del tutto irrilevante nel 99,99999% delle applicazioni.
P.S. tutte queste cose le scopriresti semplicemente leggendo, guardando (i sorgenti), leggendo e ancora leggendo.