Corso di Programmazione 2 - Laurea (triennale) in Informatica - a.a. 2005/06 - Marco Ronchetti
Programmazione 2 - aa 2005/6 > Forum > Benvenuti al Forum
  Informazioni generali   Lezioni   Video   Forum   Blog   Materiale addizionale   Esami    
Benvenuti al Forum
Grafica
Basi di Java e di Object Oriented Programming
Varie
 
Benvenuti al Forum > Grafica > in depth
Grafica
Questa sezione è dedicata a discussioni relative alla grafica in Java (Swing, AWT).

Discuss
12 participants
Hide All Hide All Content

Model View Controller
by GiampaoloFranco on 7/5/2006 11:32 AM reply
Hide Hide Content

Volevo mettere sul forum la mia soluzione di un precedente esercizio secondo il modello MVC.

L'esercizio consisteva nel creare un'applicazione che mostrava una finestra contenente tre controlli scorrevoli, un pannello, un pulsante reset e le label opportune, e tre selettori Red, Green, Blue.

Ad ogni momento, a seconda della posizione dei selettori, il pannello mostrava il colore formato dalla combinazione RGB relativa.

Volevo chiedere al forum un consiglio sulle cose che possono essere migliorate nella stesura del programma.

http://latemar.science.unitn.it:8000/segue_userfiles/2006prog2/slidercolore.zip

Grazie

appello giugno 06
by dario del sante on 6/27/2006 1:33 PM reply
Hide Hide Content

Ciao, c'è qualcuno che può mettere disponibile il codice dell'esame di giugno 2006?
grazie a tutti.
Re: appello giugno 06
by Marco Ronchetti on 6/27/2006 2:26 PM reply
Hide Hide Content

Un suo collega ha già postato una sua soluzione nella sezione VARIE del forum
metodo getSize()
by GiampaoloFranco on 6/20/2006 12:31 PM reply
Hide Hide Content

Buongiorno al forum, volevo chiedere gentilmente delucidazioni relativamente al metodo getSize. In particolare, se ho la seguente classe:

public class Rettangolo extends JPanel {
    Color colore, colore1;
    Dimension coordinate, coordinate1, area, area1;
    public void paintComponent (Graphics g) {
      super.paintComponent(g);
      g.setColor(colore);
      g.fillRect(coordinate.width,coordinate.height,area.width,area.height);
      g.setColor(colore1);
      g.fillRect(coordinate1.width,coordinate1.height,area1.width,area1.height);
    }
    public Rettangolo() {
        //set the default color of the rectangles
        Color colore = Color.YELLOW;
        this.colore = colore;
        Color colore1 = Color.BLUE;
        this.colore1 = colore1;
        //set the default dimension of the rectangles
        Dimension area = new Dimension(75, 75);
        this.area = area;
        Dimension area1 = new Dimension(75, 75);
        this.area1 = area1;
        //set the default coordinates of the rectangles
        Dimension coordinate = new Dimension(0,0);
        this.coordinate = coordinate;
       Dimension coordinate1 = new Dimension(250,250);
        this.coordinate1 = coordinate1;
    }
}

nell'istruzione evidenziata in rosso, come posso impostare coordinate1 utilizzando il metodo getSize() ? 

Io ho provato ad eseguirlo sul pannello, ma non ottengo il valore desiderato. E' corretto utilizzare getSize() su un oggetto di tipo JPanel?

Mi sono accorto che setVisible() sul JFrame non prima non è settato a true, mi impedisce di ottenere la dimensione del JPanel.

Grazie per l'eventuale gradita risposta.

Giampaolo

Domanda
by cornale85 on 6/4/2006 10:06 PM reply
Hide Hide Content

Ciao, se c'è qualcuno che ha fatto il compito d'esame dell'anno scorso (  quello del bersaglio ) potrebbe mettere sul forum il codice cosi per vedere come lo ha fatto?

Grazio a tutti

Re: Domanda (esame giugno 2005)
by Francesco Galgani on 6/9/2006 6:33 PM
attached: Esame_giugno_2005.zip
reply
Hide Hide Content

Te lo allego.
Domande generali (importanti)
by cornale85 on 5/25/2006 7:10 PM reply
Hide Hide Content

Salve a tutti, volevo fare un pò di domande:


1) Cosa fa la "super.clone()" ?
2) A che cosa serve implementare un hashcode ?
3) Da errore se non si implementa un hashcode se implementiamo una equals?
4) Posso implementare due eventi diversi in un file.java? Come?
5) Se voglio per esempio che quando premo un punto su un pannello si disegna un cerchio come faccio ( cioè "mescolare" i components  con la paintComponent)  ?
Re: Domande generali (importanti)
by Marco Ronchetti on 5/25/2006 9:43 PM reply
Hide Hide Content

1) richiama la clone del padre (risalendo eventualmente fino alla clone di Object che fa una copia bit a bit
della memoria occupata dall'oggetto che deve essere clonato)

2) A far funzionare bene le hashtables. Se non è chiaro cosa sono e come funzionano suggerisco
i riguardare la parte finale della lezione 18 in video.
Dovrebbe valere la proprietà che che due oggetti uguali finiscono nello stesso posto in una hashtable,
 e due oggetti diversi in posti diversi.
Dato che la hashtable usa hashcode per generare la chiave di accesso, quando si cambia la equals
si dovrebbe fer in modo che tale proprietà sia valida.

3) No non da errore, ma le hashtables (e le collezioni che mantengono una sola copia di oggetti uguali)
potrebbero non funzionare correttamente.

4) Che vuol dire? Non is implementano eventi, ma ascoltatori (gestori) di eventi. Una classe può implementare
diverse Listener interfaces, e quindi gestire eventi diversi.

5) Analogo a quanto detto nella risposta data a V.Sartori (paintComponents) di sopra.

PS. Tutte le domande sono importanti :-)
Flow Layout e Piu righe
by n.dorigatti on 5/21/2006 7:06 PM reply
Hide Hide Content

Stavo provando un programma semplice in cui si ha nella finestra principale un BorderLayout,dove al centro ho un pannello da gestire,con dei pulsanti posizionati nella parte nord del borderLayout.
In questa parte nord ho fatto un'altro JPanel con un flow layout,ho posizionato due bottoni,una label e due textField.
Il problema è che i componenti si dispongono tutti in una riga,andando ad uscire dal campo di visuale,non visualizzando ad esempio l'ultimo bottone. ho provato a guardare la documentazione e ho trovato questo:

JFrame frame = new JFrame("FlowLayoutDemo") {
public Dimension getMinimumSize() {
Dimension prefSize = getPreferredSize();
return new Dimension(100, prefSize.height);
}
};

cioè va impostata una dimensione minima? ma stando a quanto detto in classe non si arrangiava da solo il Layout Manager a capire quando andare a capo?
Il mio problema non è che capita perchè ho posizionato questo pannello a nord di un borderLayout,e quindi viene tutto minimizzato?

oltretutto ho notato che con questo metodo non si fa altro che avere una minima dimensione della finestra,impossibilitando l'utente a rimpicciolirla oltre.
In questo caso non c'è un metodo piu veloce,tipo frame.setMinimumSize() ? bisogna sempre fare questo procedimento?
Object.removemouselistener
by Kristian on 5/20/2006 1:11 PM reply
Hide Hide Content

Salve a tutti... Vorrei sapere se qualcuno ha capito come si fa a "togliere" un evento (Actionlistener o Mouselistener) da un oggetto. Faccio un esempio: dopo aver creato un JButton che chiamo B, gli ho assegnato un Actionlistener (chiamiamolo Al) nel solito modo, B.addAction_Listener(Al). Questo fa si che venga attivato un MouseListener (Ml) su un JPanel (jp) che controlla i click del mouse al suo interno. Adesso volevo fare in modo che premendo nuovamente B (o premendo un nuovo bottone) si disattivasse anche il MouseListener, ma pur facendo jp.removeMouseListener(Ml) non cambia assolutamente nulla. C'è qualche altro metodo per ottenere questo risultato o semplicemente sbaglio ad usare il metodo "removeMouseListener"? Grazie.
Re: Object.removemouselistener
by Marco Ronchetti on 5/20/2006 4:04 PM reply
Hide Hide Content

Anche qui, aggiungere (IN ATTACHMENT) il sorgente aiuterebbe... Il ragionamento sembra filare, ma vorrei vedere come è implementato per poter rispondere.
Re: Object.removemouselistener
by Kristian on 5/23/2006 11:36 AM
attached: Esame2.rar
reply
Hide Hide Content

Mi scuso per il ritardo con cui le rispondo... Comunque penso di aver trovato il problema, ma le invio comunque il mio progetto. Graziee ancora.
paintComponets
by v.sartori on 5/17/2006 12:01 PM reply
Hide Hide Content

Buongiorno a tutti e scusate se pongo una domanda banale.

Sul tema d'esame di giugno 2005 si chiede di disegnare un punto quando viene premuto un pulsante. Si deve reimplementare la paintComponents?

E come si chiama in modo che venga eseguita solo quando si preme il pulsante? Non capisco come si deve gestire e se posso in qualche modo

chiamarla dal metodo che gestisce il click del mouse sul bottone.

 

Re: paintComponets
by Marco Ronchetti on 5/25/2006 9:50 PM reply
Hide Hide Content

do un suggerimento:
Se si vuole far si che un bottone aggiunga un punto, e che il pannello mostri tutti i punti creati finora, si può definire una struttura
che tenga traccia di quanti punti sono stati finora creati (ad esempio una Collection di Punti).
La paintComponent dovrà esaminare la struttura e disegnare tutti i punti in essa presenti.
Quando si schiaccia un bottone, questo aggiunge il dato alla struttura e chiama la repaint sul pannello.
Domanda
by cornale85 on 5/15/2006 7:53 PM reply
Hide Hide Content

Ma che differenza c'è tra     getWidth     e     getSize().width  ?
Re: Domanda
by Marco Ronchetti on 5/16/2006 8:33 AM reply
Hide Hide Content

Dalle API di Java, jawa.awt.Component:

public int getWidth()
Return the current width of this component. This method is preferable to writing component.getBounds().width, or component.getSize().width because it doesn't cause any heap allocations.
Uso repaint
by cornale85 on 5/15/2006 7:17 PM reply
Hide Hide Content

Salve a tutti, ho fatto una semplice applicazione contenente due bottoni. La pressione del primo crea altri bottoni ( che si dispongono ordinanatamente secondo il Flowlayout ) mentre la pressione del secondo li cancella ( partendo dall'ultimo creato ).

I problemi sono due:

- Il primo bottone mi crea si il bottone ma si vede soltanto se ingrandisco la finestra, il prof mi ha detto di fare la repaint ma non funziona lo stesso.

-Il secondo bottone non cancella niente....Ho usato una remove..non sò se è giusto...se qualcuno sa come fare vi ringrazio. Ciao

 

 

Re: Uso repaint
by Marco Ronchetti on 5/19/2006 3:58 PM reply
Hide Hide Content

Non vedendo il codice è difficile rispondere.. Lo può aggiungere in allegato?
Re: Uso repaint
by cornale85 on 5/20/2006 11:26 AM reply
Hide Hide Content

ECCO IL CODICE ( Non ho messo la classe che crea il JFrame perchè non serve nelle spiegazione dell'esercizio )

package ex_mio_1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Contenuto extends JFrame
{
  JPanel contentPane;
  JPanel nord = new JPanel();
  JPanel centro = new JPanel();
  JButton bottone_1 = new JButton("Crea bottone");
  JButton bottone_2 = new JButton("Cancella bottone");

  private void settingJPanel() throws Exception
  {
    contentPane=(JPanel)this.getContentPane();    
    this.setSize(400,300);                       

    contentPane.setLayout(new BorderLayout());
    contentPane.add(nord,BorderLayout.NORTH);
    contentPane.add(centro,BorderLayout.CENTER);
    nord.setLayout(new FlowLayout());
    nord.setBackground(Color.RED);
    centro.setLayout(new FlowLayout());
    centro.setBackground(Color.RED);
    nord.add(bottone_1);
    nord.add(bottone_2);
    Eventi ascoltatore = new Eventi(bottone_1,bottone_2,centro);
    bottone_1.addActionListener(ascoltatore);
    bottone_2.addActionListener(ascoltatore);
  }

  public Contenuto() //costruttore della classe che però richiama JbInit...
  {
    try
    {
      settingJPanel(); //inizializza la finestra
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  public static void main (String args[])
  {
      new Contenuto();
  }
}

EVENTI:
package ex_mio_1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class Eventi implements ActionListener
{
    JButton b_1 = new JButton();
    JButton b_2 = new JButton();
    JPanel p = new JPanel();

    public Eventi (JButton bot_1 , JButton bot_2 , JPanel pan)
    {
        this.b_1=bot_1;
        this.b_2=bot_2;
        this.p=pan; 
    }

    public void actionPerformed (ActionEvent e)
    {
        JButton oggetto = (JButton)(e.getSource());
        JButton newBotton = new JButton("Nuovo");

        if (oggetto==b_1)
        {
            p.add(newBotton);
        }
        if ( oggetto==b_2)
        {
            p.remove(newBotton);
        }
    }
}

Re: Uso repaint
by Marco Ronchetti on 5/20/2006 3:53 PM reply
Hide Hide Content

1) Aggiunta bottoni:
nella actionPerformed, dopo p.add(newBotton) occorre chiamare la p.repaint() come avevo suggerito a voce.
In realtà tuttavia questo NON BASTA, perchè quando viene modificata la composizione di un Container occorre (prima di farne la repaint) chiamare il metodo validate. Quindi tra la add e la repaint occorre aggiungere una chiamata a p.validate().

2) Rimozione bottoni:
varrebbe lo stesso discorso MA QUI C'E' UN ERRORE LOGICO NEL PROGRAMMA. Quello che si intenderebbe fare è RIMUOVERE UNO DEI BOTTONI GIA' PRESENTI, mentre quello che si fa è CREARE UN NUOVO BOTTONE e RIMUOVERLO (senza prima averlo aggiunto...)!. Per fare quel che si desidera, occorrerebbe avere una lista (una collezione, un array, una pila...) in cui tenere traccia dei bottoni già aggiunti ed eliminare l'ultimo!
Calcolatrice
by Francesco Galgani on 5/14/2006 5:26 PM
attached: Calcolatrice.jar
reply
Hide Hide Content

Ciao a tutti,
ho creato una semplice calcolatrice, utilizzabile con mouse o con tastiera.
Mi piacerebbe che deste un'occhiata al codice... cosa ne pensate?

Vi allego un archivio jar: con "java -jar Calcolatrice.jar" (oppure con un doppio click) potrete eseguire il programmino. I sorgenti sono nella cartella /src (potrete aprire il jar con WinZip o simili).

Se vi interessa, una semplice guida per creare i jar è la seguente:
http://neptune.netcomp.monash.edu.au/JavaHelp/howto/jar.htm

Grazie per i vostri commenti.
[HELP] BorderLayout e sottocomponenti
by n.dorigatti on 5/12/2006 1:39 PM reply
Hide Hide Content

Stavo cercando di creare il programma della seconda prova degli anni passati,e avevo ipotizzato come soluzione,quella di creare nella finestra principale un BorderLayout,all'interno di questo,nella parte nord un'altro pannello con dentro dei componenti. Il problema è che se passo il tutto (la classe MyPanel con dentro il BorderLayout principale) non riesco ad accedere ai componenti piu interni della parte nord. Non trovo la sintassi corretta...
Ho chiamato il pannello principale content , il pannello nord north,e non trovo la sintassi,credevo che facendo content.north potessi arrivarci ma non funziona. Come accedere quindi a campi di pannelli contenuti nel BorderLayout?
Re: [HELP] BorderLayout e sottocomponenti
by Marco Ronchetti on 5/14/2006 9:01 PM reply
Hide Hide Content

Per rispondere bisognerebbe vedere il codice, ma in generale il contenimento grafico non è in relazione con il contenimento di oggetti (has-A).

Faccio un esempio:

class MyFrame extends JFrame {
      JPanel  content=new JPanel();
      JPanel north=new JPanel();
     JButton b= new JButton();
    MyFrame () {
      this.setContentFrame(content);
      content.setLayout(new BorderLayout);
      content.add(north,Border.NORTH);
      north.add(b);
      ...
   }
  ...
}

Ho costruito un pannello regolato da un BorderLayout, a nord ho aggiunt un pannello chiamato north che contiene un bottone chiamato b.

Supponiamo ora che io abbia una classe esterna  (ad esempio da un listener) a cui è stato passato il mio MyFrame, e supponiamo che in tale classe il mio MyFrame sia chiamato mf.
Se voglio accedere al bottone (ammesso che le regole di visibilità public-private ecc. lo permettano), non devo seguire il contenimento dicendo
 
mf.content.north.b

ma semplicemente

mf.b

perchè b è una variabile di istanza di MyFrame, e non importa dove graficamente essa sia stata collocata...
Re: [HELP] BorderLayout e sottocomponenti
by n.dorigatti on 5/14/2006 11:21 PM reply
Hide Hide Content

ok,grazie mille,ho capito dove sbagliavo,alla radice.. Grazie mille dell'aiuto,ora va tutto alla perfezione
Re: [HELP] BorderLayout e sottocomponenti
by Kristian on 5/12/2006 7:05 PM reply
Hide Hide Content

Non ho ben capito il problema, cosa significa che devi accedere ai componenti più interni? Se devi modificare ad esempio qualche jbutton, basta che fai 'nomejbutton'.'azionedesiderata', senza bisogno di accedere a nulla... Spero di essere stato di aiuto...
Layout & setSize
by Kristian on 5/11/2006 12:47 PM reply
Hide Hide Content

Salve a tutti... Ho una domanda: dopo aver impostato il layout come Flow o Border su un JPanel, è ancora possibile cambiare le dimensioni degli oggetti creati all'interno? Mi spiego meglio: io creo un JPanel, successivamente imposto un layout ad esempio di tipo Border, dopodichè inserisco una TextArea che chiamo "testo", diciamo in posizione Center nel Layout, a questo punto provo a fare per definirne le dimensioni, ma non cambia nulla... C'è un modo per ottenere la dimensione dell'oggetto desiderata pur usando tipi predefiniti di Layout? O devo porre il Layout a null e impostare manualmente il tutto? Grazie.
Re: Layout & setSize
by Novella Brugnolli on 5/11/2006 8:40 PM reply
Hide Hide Content

Utilizzando un BorderLayout o un FlowLayout non è possibile specificare le dimensioni dei componenti. Sono disponibili altri gestori di layout più flessibili ma meno semplici da utilizzare (ad esempio il GridBagLayout). Tieni presente che anche in questo caso è possibile specificare dei vincoli a cui il componente è soggetto (come per il BorderLayout) che saranno utilizzati per "impaginare" l'interfaccia, e le dimensioni effettive dei componenti saranno calcolate in base a queste e non a quelle esplicitamente specificate da te.
Composizioni più complicate si ottengono con il metodo suggerito dal tuo collega, e cioè utilizzando dei pannelli di appoggio sui quali impostare dei gestori di layout opportuni (non null). In generale è buona regola utilizzare questo metodo e non affidarsi al posizionamento assoluto dei componenti.
Re: Layout & setSize
by Kristian on 5/12/2006 7:05 PM reply
Hide Hide Content

Grazie per l'aiuto...
Re: Layout & setSize
by cornale85 on 5/11/2006 2:32 PM reply
Hide Hide Content

Io credo che una volta impostato il layout ( a meno che non sia null ovviamente )  non puoi ridimensionare le componenti.....Però hai fatto una domanda interessante....vediamo cosa dicono gli altrivo il prof.
Re: Layout & setSize
by n.dorigatti on 5/11/2006 3:10 PM reply
Hide Hide Content

Da quanto ho capito io,il Border layout è quello con i punti cardinali no? Il prof non aveva detto che ad esempio nel CENTER si può mettere un'altro JPanel? perche in tal caso se metti un'altro JPanel li dentro,lo puoi mettere con layout null e puoi inserire ogni cosa dove vuoi,spero di non sbagliarmi....
IMPORTANTE CONSIGLIO
by cornale85 on 5/9/2006 2:47 PM reply
Hide Hide Content

Salve a tutti, ho un problema...Io ho fatto un'applicazione, in particolare un orologio....Ora vi spiego il mio problema:

Ho disegnato le lancette con la " fillArc"  con lo stesso meccanismo dell'esercizio fatto in classe dal prof che ad ogni click

del mouse si spostava in senso orario il "quarto all'interno del cerchio" ( Il primo dell'animazione) , ovviamente ho aggiunto

un MouseListener che come azione decrementa il grado dell'Arco (la nostra lancetta)...Fino a qui tutto apposto.

-Vorrei modificare l' esercizio: vorrei che lancetta non si spostasse con il click del mouse, cioè usando gli eventi ma

vorrei usare la " Thread.sleep(millisec) "  ( messa all'interno del blocco try catch e ad un ciclo while(true) come nell'esempio

del professore riguardante l'esercizio in cui il contentPane cambiava colore da solo dopo 800 Millisec) 

Io ho già provato a farlo ma non mi viene giusto, anzi non si vede più niente nel contentPane ( come se fosse = null )

Qualcuno mi potrebbe aiutare?

 Grazie, se volete vi posto il codice sorgente.

Re: IMPORTANTE CONSIGLIO
by Marco Ronchetti on 5/9/2006 10:18 PM reply
Hide Hide Content

Non è un problema banale!
Per fare una animazione di questo tipo occorre avere DUE threads. Ne discuteremo a lezione più avanti. Per ora dovrà portare un pò di pazienza!
Re: IMPORTANTE CONSIGLIO
by Marco Ronchetti on 5/19/2006 3:56 PM reply
Hide Hide Content

Si veda in proposito la lezione 19 del 18 maggio.
ImageIcon e percorsi
by PoggianellaMauro on 5/3/2006 10:23 PM reply
Hide Hide Content

Salve a tutti, ho un piccolo problema.... quando uso un ImageIcon per personalizzare pulsanti e varie non riesco a impostare il percorso relativo. Mi spiego meglio. Se nel path dell'immagine da caricare scrivo il percorso assoluto (C:\\Documents and Settings\\Mauro\\jbproject\\Agenda\\classes\\agenda\\img\\immagine.jpg ) l'immagine viene corretamente caricata e visualizzata. Il fatto di usare un percorso assoluto però non mi piace (per il soolito problema della distribuzione ad altri utenti...).
Allora ho provato a inserire il percorso relativo, rispetto alla certella contenente i file class ma le immagini non vengono trovate! i file class si trovano in C:\\Documents and Settings\\Mauro\\jbproject\\Agenda\\classes\\agenda\\

Non so come fare, questa è l'istruzione che dovrebbe caricare l'imamgine e metterla al posto del pulsante:

Save_floppy.setIcon(new ImageIcon("img\\immagine.jpg"));
Re: ImageIcon e percorsi
by Novella Brugnolli on 5/6/2006 6:00 PM reply
Hide Hide Content

Se stai usando JBuilder, puoi salvare la tua directory img in quella che per JBuilder e' la "Working Directory" del progetto. Una volta fatto puoi indirizzare l'immagine come hai fatto sopra.

In generale, quando si vogliono distribuire delle risorse associate al programma (come file immagine, gli stessi .class, file di configurazione, ecc..) in modo indipendente dal percorso in cui viene salvata l'applicazione, si puo' "impacchettare" tutto in un archivio con particolari caratteristiche (file .jar).
Per approfondimenti si puo' leggere:
http://java.sun.com/docs/books/tutorial/deployment/jar/index.html
componenti grafica 2
by paolo on 5/1/2006 10:38 PM reply
Hide Hide Content

scusi per il ritardo!

ecco il mio codice:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Pannello extends JPanel {
   JFrame f;
   public static final String testolabel="N° click: ";

   public Pannello() {
      this.setupGraphicEnvironement();
      this.addComponent();


   }

   public void setupGraphicEnvironement () {   // creazione della finestra
       f=new JFrame("Counter click"); 
       f.getContentPane().setLayout(null);
       f.getContentPane().setBackground(Color.GREEN);
       f.setBackground(Color.GREEN);
       f.setVisible(true); 
       Dimension d= Toolkit.getDefaultToolkit().getScreenSize();
       f.setSize(d.width,d.height);
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   }

   public void addComponent () {    // creazione della label e inserimento nel pannello
      JLabel l=new JLabel(testolabel+0); 
      l.setSize(200,200);
      f.getContentPane().add(l); 

      Listen L=new Listen(l); 
      f.getContentPane().addMouseListener(L); 

   }


    public static void main(String[] args) {
        new Pannello();
    }
}
Re: componenti grafica 2
by n.dorigatti on 5/2/2006 12:30 AM reply
Hide Hide Content

credo che il tuo problema sia dato dal fatto che fai:
f.setVisible(true);
prima di aggiungere bottone label ecc...
Tu quando crei un Pannello richiami setupGraphicEnvironement e dopo addcomponent. Il problema è che rendi la finestra visibile non appena è creata,e non alla fine di tutto!!dovresti provare a spostare
f.setVisible(true);
ad esempio nell'ultima riga di addComponent.
se non sbaglio non visualizzi i bottoni finche non fai il resize perchè dopo aver reso la finestra visibile non la aggiorni piu,mentre quando fai il resize si aggiorna. Spero sia corretto
Comunque sia mancando la classe Listen il programma non funziona correttamente,cioè non vengono contati i click del mouse. ciao ciao
Re: componenti grafica 2
by Marco Ronchetti on 5/3/2006 9:36 PM reply
Hide Hide Content

Si la diagnosi è esatta.

In alternativa si potrebbe aggiungere una
f.repaint();
alla fine della addComponent ().

NOTA:
      Listen L=new Listen(l);
non mi piace. Il nome degli oggetto dovrebbe SEMPRE essere minuscolo, qui è maiuscolo (L).
Re: componenti grafica 2
by paolo on 5/2/2006 10:59 AM reply
Hide Hide Content

grazie adesso provo e poi ti faccio sapere. comunque la classe listener non l'ho inserita perchè non mi sembrava inerente alla domanda in realtà l'avevo fatta. ciao
componenti grafica
by paolo on 5/1/2006 7:16 PM reply
Hide Hide Content

Buon giorno a tutti! volevo chiedere a qualcuno il perchè quando creo una finestra con dei componenti all'interno come dei bottoni,label, ecc per riuscirle a visualizzare devo fare un resize della stessa. ciao e grazie a tutti.
Re: componenti grafica
by Marco Ronchetti on 5/1/2006 8:56 PM reply
Hide Hide Content

vedere il codice che ha scritto aiuterebbe a capire dov'e' il problema.
Soluzione generale MouseListener
by a.scipioni on 4/26/2006 5:18 PM reply
Hide Hide Content

Progammando un po' in java a volte sorge la necessità di associare un listener  a due oggeti completamente diversi.
Si possono adottare molte soluzioni, tra cui creare listener appositi, passare gli oggetti per riferimento, ecc ...

Volendo sfruttare il parametro "e" degli eventi, ho notato che  tra i suoi metodi esiste un getClass( ) e getComponent( )..

É possibile sfruttarli per referenziarsi direttamente all'oggetto che è stato cliccato ? e quindi potervi accedere direttamente senza istanziare una nuova classe?
(in questo caso eviterei anche import ripetuti in cima alla classe MouseListener ).

Spero di essere stato abbastanza chiaro...
Re: Soluzione generale MouseListener
by Marco Ronchetti on 4/26/2006 6:04 PM reply
Hide Hide Content

In genere si usa chiamare il metodo getSource sull'evento. Questo restituisce l'oggetto per cui l'evento è stato generato. Avendo quindi ad esempio due bottoni collegati allo stesso ActionListener, si può in questo modo disambiguare quale dei due bottoni è stato premuto.
Pro & contro MyClass extend JFrame
by a.scipioni on 4/26/2006 4:31 PM reply
Hide Hide Content

Non è più conveniente formalizzare una classe che non estenda nessuna altra classe grafica?
facendo così non ci siamo già sfumati l'opportunità di ereditarietà della classe stessa?

Mi sto riferendo in particolare alle slide del professore in cui, ad ogni esempio il JFrame viene esteso dalla classe esempio che facciamo.

Ci sono dei pro "computazionali" oppure è solo a scopo didattico?

Grazie
Re: Pro & contro MyClass extend JFrame
by Marco Ronchetti on 4/26/2006 6:10 PM reply
Hide Hide Content

In genere si costruiscono sottoclassi delle componenti grafiche primitive (es. di JFrame) per ottenere componenti customizzate che abbiano i requisiti richiesti per il programma. Nella maggior parte dei casi questo approccio va bene.
Responsabilità di tipo diverso (ad esempio gestionali) vengono di solito incapsulate in altre classi che possono essere collegate alla finestra stessa. In genere si segue una scomposizione "Model - View - Controller" in cui il Model contiene i dati, la View la presentazione degli stessi, il Controller tutta la logica di business (ovvero di controllo).  La parte "View" può essere fatta sottoclassando classi della libreria grafica.
You are replying to "Re: Pro & contro MyClass extend JFrame"
If you part of the Universit� di Trento community or have posted to a public forum here and received a visitor user account, please log in before posting. If you do not yet have a user account, please register below.


Re: Pro & contro MyClass extend JFrame
by n.dorigatti on 4/26/2006 4:50 PM reply
Hide Hide Content

ciao,io credo che il professore abbia utilizzato quel modo per mostrarci una via possibile,ma non l'unica o la migliore,poichè se guardi la documentazione,il primo programma swing è quello del count dei click del mouse,in cui viene implementata la classe ActionListener e non quella JFrame.. da quanto detto fin'ora ereditare una classe ha la maggior parte delle volte lo scopo di utilizare un istanza di quella classe ed aggiungierci funzionalità,ma se devi creare un semplice frame e inserirci bottoni,beh,credo che entrambi i metodi siano corretti,in fondo ActionListener la devi estendere lo stesso no?
Questo è quello che penso di aver capito,correggetemi se sbaglio!
layout liquido
by GiampaoloFranco on 4/24/2006 9:50 AM reply
Hide Hide Content

Un ciao a tutti, volevo chiedere al forum un consiglio su come poter sviluppare un layout liquido sulla mia semplicissima applicazione: una finestra con un bottone: cliccando sul bottone il bottone si sposta altrove nella finestra. Vi allego anche il mio codice.
Come potete vedere, ho inserito il settaggio della dimensione del frame all'interno della classe ButtonPanel, in modo da poter avere le dimensioni della finestra anche nell'actionPerformed , oltre che nel main.
Quello che vorrei fare è avere un solo punto in cui settare le dimensioni della finestra (nell'esempio 400 x 300). Come posso fare?

Ciao e grazie anticipatamente per la risposta.

Giampaolo

/**
   Author: Franco Giampaolo
   Date: 20 apr 2006 / (Copyright. 2006) - University / Exercise of Prog II
   When the user clicks the button, it moves to another position.
*/
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ButtonPanel extends JPanel implements ActionListener {
  // create the button
  JButton bottone = new JButton("Click!");
 
  // set the dimension of the window
  int rangeX =  400;
  int rangeY =  300;
 
  // constructor : add the button to the ButtonPanel - set size & random position
  ButtonPanel() {
  this.add(bottone);
  this.setLayout(null);
  bottone.setBounds(rangeX /2 - 50, rangeY /2 - 30, 50, 30);
  // register the panel as listener at the button
  bottone.addActionListener(this);
  bottone.setActionCommand("moving");
  }

  // this method of ButtonPanel is called when a button is clicked
  public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand()=="moving") {
      int posX, posY;
      Random generatore = new Random(System.currentTimeMillis());
      posX = generatore.nextInt(rangeX - 60);
      posY = generatore.nextInt(rangeY - 60);
      System.out.println("The button now in (" + posX + "," + posY + ")");
      bottone.setBounds(posX , posY , 50, 30);
    }
  }
}
 
 public class MoveBottone {
   public static void main(String[] args) {

     JFrame frame = new JFrame("Muovi il bottone");
     // creo il bottone nel pannello in posizione (x,y)
     ButtonPanel panel = new ButtonPanel();
     frame.getContentPane().add(panel);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setSize(400, 300);
     frame.setVisible(true);
   }
}
Re: layout liquido
by n.dorigatti on 4/24/2006 10:53 AM reply
Hide Hide Content

non capisco bene quello che intendi,ma immagino che vuoi fare una cosa del genere:
frame.setSize(DIMENSIONI_IN_BUTTONPANEL)
non vorrei dirti una cavolata,ma te li hai inseriti appunto in button panel,giusto?
definendoli cosi:
int rangeX =  400;
int rangeY =  300;
quindi non sono private e li dovresti poter richiamare dall'esterno se crei un'istanza di ButtonPanel,cosa che nel main fai quasi subito. Hai provato a fare:
frame.setSize(panel.rangeX,panel.rangeY);
?
A me funziona senza problemi.
Un'altra cosa,ti consiglio di inserire una riga tipo:
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
f.setLocation((screenSize.width - panel.rangeX)/2,(screenSize.height - panel.rangeY)/2);

almeno cosi hai la finestra centrata,è un pò piu bella esteticamente al centro piuttosto che in cima.
saluti
Re: layout liquido
by GiampaoloFranco on 4/24/2006 2:30 PM reply
Hide Hide Content

ok ho fatto le modifiche da te consigliate e funziona! Ho capito come gestire questa casistica di problemi, grazie.
Ciao
Priorità per inserire componenti in GUI
by GiampaoloFranco on 4/21/2006 10:32 AM reply
Hide Hide Content

Buongiorno a tutti!
Secondo voi esiste una priorità particolare nell'inserimento e/o creazione delle componenti grafiche per costruire la GUI all'interno di una classe?
Quale sarebbe la priorità per costruire una finestra con un bottone ? Il bottone lo creo prima o dopo aver creato la finestra ? Rendo visibile il JFrame prima o dopo aver creato tutte le componenti ?

Grazie mille per la risposta

giampaolo
Re: Priorità per inserire componenti in GUI
by n.dorigatti on 4/21/2006 2:05 PM reply
Hide Hide Content

Se ho ben capito stai chiedendo in che ordine creare i componenti,giusto?
Bene,se quello che ho imparato è corretto,penso che per prima cosa si debba creare un JFrame,in cui verrà posizionato il contentpane,dentro il quale ci puoi inserire i bottoni. Poi dipende da come fai la tua classe,ad esempio nell'esempio precedente la classe estendeva il JFrame,quindi al suo interno si creavano un contentpane e uno o piu bottoni (prima il new ecc... e poi contentpane.add(bottone) ) e l'istanza del JFrame veniva creata o nel main,o in un metodo di appoggio. Per il rendere visibile il tutto,come consigliato dal professore è piu corretto rendere visibile la finestra DOPO aver creato l'intera GUI,altrimenti ti vedi una finestra che si muove,ingrandisce e crea bottoni davanti agli occhi,e non mi pare molto corretto.
Spero di aver risposto correttamente e in modo chiaro, in ogni caso ti consiglio di guardare l'esemprio nella documentazione:
Vai su Java Tutorials,creating a GUI with JFC/Swing,Learning by example,e segli il secondo esempio.
Piu precisamente l'indirizzo è: http://java.sun.com/docs/books/tutorial/uiswing/learn/example2.html
Se ti guardi il sourcecode del programma è semplice e ti mostra anche come impostare il look & feel (attento però,ho notato che il GTK su win non è installato).
saluti.
Re: Priorità per inserire componenti in GUI
by Marco Ronchetti on 4/21/2006 2:43 PM reply
Hide Hide Content

La risposta di Dorigatti è sostanzialmente corretta.
Ci sono tre fasi nella costruzione di un pezzo di interfaccia:
- creazione
- inizializzazione-composizione
- visualizzazione
Suggerisco di rispettare l'ordine delle fasi.
PRIMA si creano gli elementi (non importa i che ordine, anche prima un bottone e poi la finestra che lo conterrà).
SUCCESSIVAMENTE si inizializzino le componenti specificandone le proprietà (ad es. settando il colore di background, definendo i listeners ecc.).
QUINDI s effettui la composizione, pondendo bottoni, labels ecc. nei pannelli (se si prevedono questi contenitori intemedi) e i disponendo i pannelli dentro la finestra.
INFINE si visualizzi il tutto.
[INFO] Java in laboratorio
by n.dorigatti on 4/20/2006 9:11 PM reply
Hide Hide Content

Questa mattina ero in laboratorio per provare uno dei programmi assegnati dal professore,con un compagno siamo arrivati alla soluzione,ma tale programma non funzionava a dovere.
trovate il source qui: http://www.turricatch.altervista.org/SelPosition.java
il programma dovrebbe spostare il bottone dove si clicca con il mouse,e se si clicca il bottone quest'ultimo torna alla posizione iniziale.
Bene,in laboratorio non funzionava a dovere,cioè spostava il bottone ovunque,ma premendolo non ritornava alla posizione iniziale,lo faceva solo se si trovava nell'area in cui veniva posizionato al momento della creazione.
Nel pomeriggio poi ho provato lo stesso file da casa e funzionava alla perfezione,utilizzando Windows. Volevo sapere se qualcuno ha provato qualche programma e ha avuto problemi analoghi.
Re: [INFO] Java in laboratorio
by Marco Ronchetti on 4/20/2006 9:34 PM
attached: Selposition.java
reply
Hide Hide Content

Ecco in attachmentl file di cui parla Dorigatti. Bravi per essere riusciti a fare una implementazione.
Non mi è chiarissimio dalla descrizione quale sia il probleme riscontrato.
Devo dire che a prima vista una cosa che sicuramente NON mi piace l'uso delle variabili dichiarate static (anche se questo non ha nulla a che vedere con il problema riferito). In un compito di esame una soluzione basata su static in questo tipo porterebbe ad una sottrazione di punti... Riuscite a riaggiustarlo eliminando lo static usato a spoposito? RIcordate che static si usa quando serve definire una proprietà che deve essere condivisa da tutte le istanze della classe, cosicchè se una la cambia, cambia anche per gli altri. Qui static è usato per risolvere artificiosamente un altro problema. Quale? Qual'è la soluzione corretta?
Re: [INFO] Java in laboratorio
by n.dorigatti on 4/20/2006 10:42 PM reply
Hide Hide Content

riguardando il codice mi sono accorto che le righe static int xb e static int yb sono obsolete e non usate.
la riga successiva:
static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
viene utilizzata solo in questa riga:
f.setLocation((f.screenSize.width - frameSize.width)/2,(f.screenSize.height - frameSize.height)/2);
che si trova nel metodo appoggio nella classe,quindi static è inutile,o meglio si può togliere senza danni.
D'altro canto,se è vero che stati è usato per proprietà condivise da tutte le istanze di classe,è vero che screenSize è una variabile che dovrebbe essere presa una volta e vale per tutti,poichè solitamente la risoluzione dello schermo è una unica per ogni oggetto. In ogni caso static si può rimuovere,e quindi mi pare che il problema delle variabili static sia passato.
Per quanto riguarda il mio problema intendevo dire che,in laboratorio, fintanto che volevo spostare il bottone in base alla posizione del mouse tutto andava perfettamente,ma quando volevo premere il pulsante per farlo tornare alla posizione iniziale,non accadeva nulla,come se tutto fosse coperto da un layer invisibile che gestiva solo il MouseListener. Ora a casa però lo stesso codice funziona,e chiedevo appunto se qualcuno ha riscontrato questa anomalia. Settimana prossima ad ogni modo voglio riprovare il codice.

Ps:Su windows e con Firefox 1.5.0.2 L'RSS non funziona,mi rimanda al sorgente della pagina dicendo:
        Il file XML specificato apparentemente non ha un foglio di stile associato. L'albero del documento è mostrato di seguito.

saluti.
Re: [INFO] Java in laboratorio
by Marco Ronchetti on 4/21/2006 11:08 AM reply
Hide Hide Content

Per L'RSS occorre avere un lettore RSS, da installare ad esempio come plug in di Firefox (vedere sotto la voce "Benevenuti al Forum").
Hide All Hide All Content


Benvenuti al Forum > in depth




 

more rss...

powered by segue
segue_logo