Interfaccia grafica

di il
50 risposte

50 Risposte - Pagina 2

  • Re: Interfaccia grafica

    Per iniziare, un nome non a caso .... ti dice nulla CardLayout ?
  • Re: Interfaccia grafica

    Si è il CardLayout !!
  • Re: Interfaccia grafica

    Ciao.
    Ex1
    
    ...
    ...
    this.add(Componente);
    
    Ex2
    
    ...
    ...
    this.getContentPane().add(Componente);
    
    Praticamente fanno la stessa cosa.Cosi mi sembra di capire.
    Ma dei due, quello che in teoria dovrebbe eseguire l'istrunzione, più velocemente , credo sia l'esempio A, che chiama solo la funzione add.
    nell'esempio b l'istruzione viene eseguita in due passaggi.
    Sempre se non è una di quelle cose automatiche di java.
  • Re: Interfaccia grafica

    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.
  • Re: Interfaccia grafica


    grazie.
  • Re: Interfaccia grafica

    Ciao...
    Ho un Layout di tipo BorderLayout.
    Quindi a conti fatti ho 5 pannelli, nei 4 punti cardinali eduno al centro.
    Sei volessi cambiare le dimensioni del lato WEST
    mi vedo obbligato ad istanziare prima un JPanel sul lato WEST
    con setPreferredSize(new Dimension(int,int);
    riesco a personalizzare un pò le dimensioni del mio pannello.
    Ma se non volessi aggiungere un JPanel sul lato WEST
    e personalizzare le dimensioni del lato WEST, non ci riesco.
    Ho provato ad utilizzare un metodo createEmptyBorder...qualcosa del genere non ricodo.
    Ma cmq il compilatore non mi da errore.
    Un altra cosa strana, è che se imposto qualsiasi component su CENTER
    automaticamente mi riempie tutto il frame, se non ci sono altri elementi nei rispettivi pannelli del BorderLayout().
    Sicuramente fa parte degli automatismi di java
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Sei volessi cambiare le dimensioni del lato WEST
    mi vedo obbligato ad istanziare prima un JPanel sul lato WEST
    con setPreferredSize(new Dimension(int,int);
    riesco a personalizzare un pò le dimensioni del mio pannello.
    In WEST/EAST viene rispettato il preferred width, mentre in NORTH/SOUTH viene rispettato il preferred height. Su questi ci si dovrebbe in generale basare. Ovvero nel tuo pannello in WEST non dovresti "imporre" dimensioni ma fare in modo che il pannello stia alla sua giusta dimensione "preferita". E questo ovviamente dipende dal layout manager usato nel pannello WEST e dai componenti contenuti. Eventualmente puoi "giocare" su border, margin, padding ecc.. a seconda del layout manager usato nel pannello in WEST e dei componenti usati.

    Alexxandro ha scritto:


    Ma se non volessi aggiungere un JPanel sul lato WEST
    e personalizzare le dimensioni del lato WEST, non ci riesco.
    Se non c'è un componente in WEST .... non c'è niente in WEST e non occupa nulla su quel lato. Elementare Watson ...

    Alexxandro ha scritto:


    Un altra cosa strana, è che se imposto qualsiasi component su CENTER
    automaticamente mi riempie tutto il frame, se non ci sono altri elementi nei rispettivi pannelli del BorderLayout().
    Ma questa È la logica del BorderLayout! La parte CENTER riempie tutto lo spazio disponibile del contenitore (che ha il BorderLayout) a meno dello spazio occupato (eventualmente, se presenti) dalle altre 4 aree.
  • Re: Interfaccia grafica

    Ciao.
    come posso avere un riferimento puntatore al mio JPanel.
    Voglio cambiare il colore del pannello.
    Però questo succede quando clicchi un bottone.
    L'evento di questo bottone, in ActionPermormed,
    a una new Oggetto(JPanel )a cui voglio passare il riferimento del mio pannello,
    e modificare il suo colore sfruttando la nuova classe istanziata.
    Ci sono riuscito solo mettendo il JPanel tra gli attributi della classe FinestraPrincipale.
    Ma se il mio JPanel, nasce nel costruttore della FinestraPrincipale, non riesco a trovare un modo per avere un riferimento
    da passare al mio oggetto.
  • Re: Interfaccia grafica

    Ma in Java è possibile inserire un immagine, in un JPanel,
    senza usare una JLabel?
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Ma in Java è possibile inserire un immagine, in un JPanel,
    senza usare una JLabel?
    Certo, basta sfruttare il "custom painting". Si estende JPanel e si ridefinisce il protected void paintComponent(Graphics) e lì si disegna quello che si vuole, pure immagini eventualmente.
    Chiaramente bisogna avere ben chiaro come funziona il painting in Swing, come si usa la API Java 2D, ecc... altrimenti come sempre non si va molto lontano.

    Tra l'altro questo approccio permette di usare il JPanel sia come superficie di disegno, sia come "contenitore" di altri componenti. In questo modo il disegno sta "sotto" i componenti e fa appunto da sfondo. Ho uno dei miei Java Examples che è proprio dedicato a questo.
  • Re: Interfaccia grafica

    Dovrei studiarmi la JAVA2d e poi con ecc che altro intedi??
    io ho dato uno sguardo al load/reading image
    ed ho trovato questo codice
    ma non riesco ad interpretare alcune istruzioni
    
    public class LoadImageApplet extends Applet {
     
         private BufferedImage img;
     
         public void init() {
             try {
                 URL url = new URL(getCodeBase(), "examples/strawberry.jpg");//QUESTA CLASSE CONTIENE UN RIFERIMENTO ALL'IMMAGINE??
                                                                                                              //CMQ DOVREBBE ESSERE VISTA COME L'IMMAGINE
                 img = ImageIO.read(url);//QUI CARICO L'IMMAGINE NELLA CLASSE BUFFEREDIMAGE CHE MI PERMETTE DI VISUALIZZARLA??
             } catch (IOException e) {
             }
         }
         @Override
         public void paint(Graphics g) {  //SENZA QUESTO METODO L'IMMAGINE NON VIENE VISUALIZZATA.
                                                       //MA COME CI SI ARRIVA QUI ??
           g.drawImage(img, 50, 50, null);
         }
    }
    
    grazie
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    Dovrei studiarmi la JAVA2d e poi con ecc che altro intedi??
    Sì ma anche i concetti specifici di Swing, quali sono le differenze tra i componenti AWT e Swing, come funziona il painting (che in Swing è un po' differente e particolare rispetto ad AWT) ecc...

    Alexxandro ha scritto:


    ed ho trovato questo codice
    Occhio che le applet sono una cosa un po' a parte (e ormai da molti anni parecchio in disuso).

    Alexxandro ha scritto:


    ma non riesco ad interpretare alcune istruzioni
         public void paint(Graphics g) {  //SENZA QUESTO METODO L'IMMAGINE NON VIENE VISUALIZZATA.
                                                       //MA COME CI SI ARRIVA QUI ??
    
    Ecco, questo è il "punto" che devi comprendere bene. Il paint NON lo invoca tipicamente il programmatore ma lo invoca il framework! Le interfacce grafiche, in generale, sono tutte basate su "eventi". Non è il programmatore che decide "quando" una finestra o una sua parte deve essere (ri)disegnata. La finestra potrebbe coperta da un'altra, potrebbe essere parzialmente fuori dallo schermo, potrebbe essere minimizzata a icona nella taskbar, ecc...
    Quando succede qualcosa per cui una finestra o sua parte viene scoperta, il primo che lo "sa" e se ne accorge è il sistema operativo. Alla applicazione verrà quindi inviato un evento che in sostanza dice "ora disegnati!". Il paradigma quindi è semplice: il disegno delle finestre è sempre basato su eventi e quello che bisogna fare è predisporre una "funzione" (diciamola così in generale) che sa cosa/come disegnare ma NON sa "quando". Solo quando ci sarà davvero bisogno di aggiornare la finestra, allora qualcuno invocherà quella funzione. E non sarai tu a farlo.

    Questo in sostanza è il senso del paint(Graphics) che se noti è un "override". Hai esteso Applet e ridefinito il paint, quindi quando il framework avrà bisogno di aggiornare la superficie della applet, invocherà polimorficamente il paint, e sarà eseguita la tua implementazione di paint, proprio perché è un override, una ridefinizione.
  • Re: Interfaccia grafica

    Grande!!!
    mi hai sbloccato ahahah
    Non capivo proprio chi chiamava il metodo paint
  • Re: Interfaccia grafica

    Ciao.
    ho questo codice:
    [Con l'istruzione TIPO 1 riesco a vedere un cerchio
    con le istruzioni TIPO 2 invece no...
    eppure sono equivalenti
    
    		public class Finestra extends JFrame{
    		..
    		//TIPO 1
    		add(panCen.add(panOUTPUT.add(new Disegna())));
    		//TIPO 2
    		panOUTPUT.add(new Disegna());
    		panCen.add(panOUTPUT);
    		getContentPane().add(panCen);
    		..
    
    la classe per creare il disegno
    
    
    public class Disegna extends JComponent{
    	private Ellipse2D cerchio = new Ellipse2D.Double(100,100,100,100);
    	
    	public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		Graphics2D g2d = (Graphics2D)g;
    		g2d.draw(cerchio);
    		
    	}	
    }
    
  • Re: Interfaccia grafica

    Alexxandro ha scritto:


    eppure sono equivalenti
    No, NON sono equivalenti. Ti do 2 indizi:

    1) il add() che hai usato restituisce il componente aggiunto.
    2) Il tuo Disegna è un componente ma non possiede un "preferred size" coerente con il disegno, quindi non è appropriato ora come ora in un layout manager che rispetta il preferred size.
Devi accedere o registrarti per scrivere nel forum
50 risposte