Newsgroup: it.comp.java
Titolo: Programmino da risolvere

Salve,
sono una studente universitaria che ha appena cominciato la sua
avventura con Java.
Avrei un quesito/programmmino da proporvi, al quale io non riesco a
giungere proprio per inesperienza, nonostante sia abbastanza semplice.
Devo realizzare un frame, con relativo pannello, che contenga due
pulsanti sui quali vi sia presente su uno la scritta "START" e l'altro
"STOP": premendo start parte una pallina (creata come disegno e non
come immagine, suppongo Ellipse2D) che rimbalza ogni volta che tocca
la fine del frame, così all'infinito, se si spinge stop deve apparire
la scritta, in messo al frame "SONO FERMA".
Ammetto che non sono riuscita a farlo, nonstante la presunta
semplicità, ma vi sono dei particolari:
- la classe che crea il pannello estende JPanel e nello stesso tempo
implementa ActionListener.
- per la programmazione si usa JDK1.3 ma la logica riprende più le
versioni vecchie e bisogna usare due cicli decisionali ma non sò dove
metterli: penso che uno riguardi i click sui pulsanti (se pigi questo
fai cosi, se pigi questo fai così) un'altro per per fermare e far
rimbalza la palla quando finisce il frame (sempre per supposizione).
Aiutatemi, devo capire come funziona e fino ad ora non ci sono
riuscita ed il prossimo compito suppongo che, almeno in parte, verterà
su una cosa del genere.
Vi ringrazio anticipatamente.
J.D. SuperNewsR

Allora.....................
Il prof. Telespallaccia ora ti spiega questo piccolo esercizio, altrimenti
ci dicono che siamo degli insensibile, menefreghisti etc.
Lo faremo tutto in SWING. Io ti spiego quello che devi fare, poi sta a te
metterci un pochino di sana buona volontà.
Per prima cosa devi tenere conto che i JFrame, non possono ricevere
direttamente i componenti da attaccarci sopra, quindi devi passare per il
loro ContentPane.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Esercizio extends JFrame implements ActionListener, Runnable
{
    private Container master;
    private JButton    cmdStart = new JButton("START");
    private JButton    cmdStop = new JButton("STOP");
    private Thread     runner    = new Thread(this);
    private boolean    runBall   = false;
    public Esercizio()
    {
        master = getContentPane();   // <<=== Ora abbiamo un qualcosa dove
attacare i componenti
        master.setLayout(null);
        // Ovviamente questo è solo un inizio.
        // Qui attaccheremo i componenti
        master.add(cmdStart);
        master.add(cmdStop);
        //ricordati di posizionare e dare una dimensione ai bottoni
        // e di attaccargli l'action listener passandogli this.
        // Ora ci serve qualcosa che gestisca il movimento della palla,
senza però
        // bloccare il sistema. Qui useremo i Thread
        // Visto che lo abbiamo dichiarato sopra, ora lo facciamo partire
        runner.start();
        // Non ti preoccupare la pallina rimarrà buona
        // Di seguito vedi un classico della gestione dei Thread
    }
    public void actionPerformed(ActionEvent e)
    {
        // O quì gestiamo gli eventi dei bottoni
        // Se hai premuto il bottone start, facciamo muovere la pallina
            if(e.getSource() == cmdStart) // e.getSource() ti da l'oggetto
che ha provocato l'evento
                runBall = true;
        // altrimenti la fermiamo
            if(e.getSource() == cmdStop)
                runBall = false;
        // Avrai notato che in realtà non abbiamo fatto altre che settare un
boolean.
        // Questo perchè, sarà prprio questa variabile, dentro il ciclo
infinito del Thread
        // a far si che l'algoritmo di movimento sia eseguito o meno
    }
    //Ora veniamo al vero motore
    // Avendo dichiarato questa classe, che implementa Runnable
    // dobbiamo fornirla obbligatoriamente del metodo run()
    // Questo metodo, è quello che viene eseguito dal Thread, nel momento
che lanciamo
    // il comando start(). Vedi sopra nel costruttore.
    public void  run()
    {
        while(true) // ciclo infinito
        {
            if(runBall) // Tadaaaa!!! ecco a che serve quel booleano
            {
                    // Ora non devi far altre che recuperare il contesto
grafico del ContentPane
                    // e disegnare un cerchio, mediante due variabili X e Y,
che aggiornerai mediante
                    // il tuo algoritmo.
            }
        }
    }
}
Il tutto è fortemente migliorabile......

Io lo ho fatto cosi.. fammi sapere cosa ne pensi
Ho messo dei commmenti sperando che siano sufficienti.. se no chiedimi
pure spiegazioni , ma fai reply qui sul newsgroup che la mia mail e'
fasulla ( anti spam :P)
-----------------------------------------------------------------------------------
 FILE : Pallina.java
---------------------------INIZIO CODICE -----------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Pallina extends JFrame implements
ActionListener,Runnable{
  //JPanel che contiene i metodi per il disengo della palla
  PannelloPalla pnlCenter = new PannelloPalla();
  //JPanel che contiene i bottoni
  JPanel pnlSouth = new JPanel();
  JButton btnStart = new JButton();
  JButton btnStop = new JButton();
  //Processo che si occupa di far giarare la pallina per lo schermo
  Thread t ;
  public Pallina() {
    try  {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    t = new Thread(this);
    t.start();
  }
  private void jbInit() throws Exception {
    this.getContentPane().setLayout(new BorderLayout());
    pnlSouth.setLayout(new GridLayout(1,2));
    btnStart.setText("Start");
    btnStart.setActionCommand("START");
    btnStart.addActionListener(this);
    btnStop.setToolTipText("");
    btnStop.setText("Stop");
    btnStop.setActionCommand("STOP");
    btnStop.addActionListener(this);
    this.addWindowListener(new java.awt.event.WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    this.getContentPane().add(pnlCenter, BorderLayout.CENTER);
    this.getContentPane().add(pnlSouth, BorderLayout.SOUTH);
    pnlSouth.add(btnStart, null);
    pnlSouth.add(btnStop, null);
    this.setLocation(0,0);
    this.setSize(600,400);
    this.setVisible(true);
  }
  public void actionPerformed(ActionEvent e) {
    if(e.getActionCommand().equals("START")){
      pnlCenter.setRimbalza(true);
    }
    else{
      pnlCenter.setRimbalza(false);
    }
  }
  public void run() {
    while (true){
      if (pnlCenter.getRimbalza()) {
        //Ad ogni ciclo faccio cambiare le coordinate alle quali viene
disegnata la palla
        // seguendo l'algoritmo implementato nel pannello nei metodi
increaseX e increaseY
        pnlCenter.increaseX();
        pnlCenter.increaseY();
        // Questa pausa da 15 millisecondi e' necessaria fra uno
spostamento e l'altro
        // perche' se no  la pallina va troppo veloce e non si riesce
a vedere
        try  {
          Thread.sleep(15);
        }
        catch(Exception e) {  e.printStackTrace();  }
      }
      //Aggiorno il pannello
      pnlCenter.repaint();
      validate();
    }
  }
  public static void main(String[] args){
    new Pallina();
  }
}
//Classe per il pannello su cui gira la pallina
class PannelloPalla extends JPanel {
  //Flag di controllo per determinare se la pala e' ferma o in
movimento
  private boolean rimbalza=false;
  //Flag per determinare la direzione della palla nei 2 assi x e y
  private boolean destra=true;
  private boolean basso=true;
  //Coordinate alle quali viene disegnata la palla
  private int x,y;
  //Metodo per variare lo stato della palla
  public void setRimbalza(boolean b) {rimbalza=b;}
  //Metodo per conoscere lo stato della palla
  public boolean getRimbalza() {return rimbalza;}
  //Diametro della palla in pixel
  int diam = 40;
  //increaseX e increaseY fanno si' che la pallina cambi le sue
coordinate in funzione della propria posizone
  //rispetto ai bordi del pannello ogni volta che vengono chiamati
  public void increaseX() {
    if (destra) {
      if ( x+diam < this.getSize().getWidth() )
        x+=2;
      else {
        destra = false;
        x-=2;
      }
    }
    else{
      if ( x > 0 )
        x-=2;
      else {
        destra = true;
        x+=2;
      }
    }
  }
  public void increaseY() {
    if (basso) {
      if ( y+diam < this.getSize().getHeight() )
        y+=2;
      else {
        basso = false;
        y-=2;
      }
    }
    else{
      if ( y > 0 )
        y-=2;
      else {
        basso = true;
        y+=2;
      }
    }
  }
  public void paint(Graphics g){
    super.paint(g);
    //Disegno la palla rossa
    g.setColor(Color.red);
    g.fillOval(x,y,diam,diam);
    //Disegno la scritta solo se il flag di controllo mi conferma che
la palla e' ferma
    if (!rimbalza) {
      g.setColor(Color.black);
      String scritta = "SONO FERMA";
      int larghezzaScritta = g.getFontMetrics().stringWidth(scritta);
      int altezzaScritta = g.getFontMetrics().getHeight();
      int centroX = (this.getSize().width - larghezzaScritta) /2;
      int centroY = (this.getSize().height - altezzaScritta) /2;
      g.drawString(scritta,centroX,centroY);
    }
  }
}
--------------------------- FINE CODICE -----------------------------

 snip
Certo che qua c'e' gente buffa....
C'e' appena stato un thread che trattava il modo di rispondere a quesiti
simili e basta che vi sia una firma femminile per sciogliersi tutti in
burro...
Siate coerenti e se rifiutate di risolvere i compiti per casa, almeno fatelo
con tutti!
Se la richiedente avesse postato almeno un abbozzo di codice non avrei avuto
nulla da dire, ma non sopporto i falsi moralismi.
Maurus

 Siate coerenti e se rifiutate di risolvere i compiti per casa, almeno
fatelo, con tutti!
Nel mio caso, mi sono limitato a dare una traccia su come risolvere quello
che č il classico compito sui Thread (anche se l'autore del post no lo ha
ammesso, ma mi sembra il piů classico dei compitini a tema, anche il mio
libro di Java riporta lo stesso esercizio per capire i Thread)
Il fatto di aiutare o meno chi vuol farsi fare i compitini č opinabile,
quello che da fastidio e per il quale si č accesso quel flame sul post di
cui parli č dovuto dall'arroganza di persone che chiedono e si arrabbiano se
non ottengono e per di + chiedono cose che non c'entrano nulla con il tema
principale del NG.
Ciao ;)

Maurus
Beh.. maurus.. non farmene una colpa, ma ho inziato a leggere questo
NG 3 gg fa, e iti basta guardare i post vecchi per vedre che non ho
mai postato qui finora.  Non sapevo del thread ci cui parli ( magari
dimmi il titolo cosi lo leggo) , pero io ho semplicemente risposto ad
una domanda che mi pareva legittima. Ankio ho fatto una domanda e mi
hanno risposto ( anche se si trattava di solo 1 riga di codice e non
tutta una classe) . Pero' non capico proprio perche si dovrebbe negare
aiuto a chi lo chide gentilmente. 
Per altro , in questo caso , fare una pallina che rimbalza sulle
pareti mi tornava utile in quanto mi volevo cimentare nel realizzare
una specie di arkanoid formato applet tipo quelli che si vedono nei
siti di giochi gratuiti.
E poi , che diamine, non e' che se anche ti passano un programma tu
poi sei a posto . Te lo devi comunque leggere, capire e magari lo si
modifica pure nel caso non vada bene ! Altrimenti come diavolo fai a
spiegarne il funzionamento?

 spiegarne il funzionamento?
Allora,
il thread si chiamava "NG DA PAURA", che seguiva l'altro thread "Aiuto per
lavoro!!!"
In sostanza si parla del problema abbastanza ricorrente della richiesta di
svolgimento di compiti per casa, piu' o meno mascherata.
Ci sono varianti con la firma femminile, per farsi dare ascolto, o con
lusinghe varie.
Anche io se c'e' da aiutare non mi tiro indietro, ma mi da' fastidio chi
posta solo la traccia del problema, facendo un bel copy - paste dal problema
ricevuto dal professore, senza la minima proposta di risoluzione o nemmeno
una riga di codice di prova, pur sbagliato.
Maurus


Tu sei della categoria di persone ancora piu' buone di me.
Comunque per principio, se si rifiuta un aiuto a qualcuno per qualche motivo
(un compito per casa ad esempio), allora poi bisogna rifiutarlo a tutti.
A maggior ragione, poi se questo si incacchia e pretende l'aiuto richiesto,
senza il minimo sforzo di tentativo di risoluzione del problema stesso.
Quando pero' vedo che basta dichiararsi studentessa per ottenere la risposta
alla medesima richiesta fatta in precedenza dallo studente pigro allora mi
rendo conto che e' vero che la donna siede su una delle sue maggiori
risorse, e alcune ne approfittano.
:-)
Maurus

motivo (un compito per casa ad esempio), allora poi bisogna rifiutarlo a
tutti.
Soltanto una cosa: non esiste un codice che stabilisce le regole di
comportamento sul ng. Quindi non è detto che se io non rispondo a qualcuno
allora anche ad altri non possa rispondere. Se gli argomenti son validi
allora non è il caso di far l'orecchio da mercante.
Certo non son lodevoli le persone che invece di studiare preferiscono farsi
fare il codice dagli altri. Ma se uno ha la pazienza di aiutarli ben
venga... Intanto prima o poi se vorranno lavorarci con questo linguaggio i
Thread li dovranno affrontare... E senza l'aiuto eventuale di un professore
universitario che durante la sua ora di ricevimento è pagato per aiutar gli
studenti in difficoltà...
Se poi dici che le donne siedon sulla risorsa maggiore che hanno a
disposizione allora non posso e non voglio accettarlo: quante donne
programmatrici in gamba conosci? in percentuale sugli uomini? Ma se siedon
sulla loro fortuna allora perchè non fan anche loro le programmatrici?
Credimi. Nel campo tecnologico è piu facile che passi un venditore di aria
fritta uomo che una donna con le palle... Ma quando questo cambierà allora
avremo il tocco femminile anche nel codice e forse (vergognandoci un po di
piu) scriveremo meno scemenze e cose più pulite e leggibili. In fondo dove
c'è una donna c'è sempre più ordine di dove ci son solo uomini.
IMHO
--
--------------------------------
Andrea Musumeci
java programmer free lance
work:           
www.javalab.it
--------------------------------

> Tu sei della categoria di persone ancora piu' buone di me.
Oddio per un attimo ho temuto per il peggio. Pensavo che volessi farmi una
di quelle offese..... ;)
O ferso lo è, ma ben celata ? ;'(
Cmq. ti ripeto, giuro che non avevo proprio prestato attenzione al nome.

 a écrit dans le message news:
bOOJ8.1005$QT3....@twister2.libero.it...

Ciao Andrea,
prima di tutto chiariamo una cosa:
io non sono misogino e quella sulle donne era ovviamente una battuta (avevo
messo il simbolino :-) se vai a controllare). E' risaputo che le donne non
siedono sulla loro risorsa maggiore (mica siedono su di noi!)
( anche qua e' meglio che inserisco il :-) , altrimenti lo interpretate
male)
Secondo punto:
ho detto che se tu un giorno rifiuti un aiuto a qualcuno che ti chiede una
cosa, perche' tu per principio, dichiari di non svolgere i compiti a casa
altrui, allora l'indomani non puoi aiutare un altro che ti fa la medesima
richiesta.
Pecchi di incoerenza o no?
Ovviamente tu sei libero di fare quello che vuoi, ma poi io sono libero di
criticare il tuo moralismo incoerente.
Se poi per tua libera scelta, aiuti tutti coloro che postano richieste di
svolgimento di esercizi, senza il loro minimo tentativo di risoluzione e
senza lo straccio di una linea di codice, allora non posso fare a meno di
criticare il fatto che a questo mondo coloro che vogliono la pappa pronta,
prima o poi la ottengono, grazie a fessi come noi.
Maurus

Tele... Quì sta diventando un covo di studenti e studentesse e studenti che
si fingono studentesse single che ci fanno fare i loro compiti...

Mi scuso molto per il mio comportamento, ma non sapevo, davvero
scusatemi del trambusto causato!
Posto quello che io avevo realizzato, malamente naturalmente.
In questo mio programmino pigiando "START" sul prompt di MS-DOS appare
la scritta START, STOP se si pigia "STOP".
Solo questo riesco a far girare, e diversamente da i programmi
proposti da voi, super validissimi (e ve ne ringrazio), la classe dei
bottoni estende JPanel e implementa ActionListener, non JFrame.
Comunque io i thread non sò neanche cosa siano, e la vostra
programmazione è molto pià ampia delle mie conoscenze, non potrei mai
utilizzarla per i miei scopi, dovrei cavarmela con quello che sò, ma
non riesco!!! Per frmi capire, ho iniziato da una decina di giorni
l'interfaccia grafica, da 2-3 gli eventi!
Gentilmente qualcuno può dargli ancora un occhiata?
Vi ringrazio infinitamente.
J.D. SuperNewsR
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class ButtonImageTest
 {
  public static void main(String[] args)
   {
    MyFrame frame = new MyFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.show();
   }
 }
class MyFrame extends JFrame
 {
  public MyFrame()
   {
    setTitle("J.D. ButtonTest");
    setSize(WIDTH,HEIGHT);
    Pulsanti pannello = new Pulsanti();
    Container contentPane = getContentPane();
    contentPane.add(pannello);
   }
  public static final int WIDTH = 400;
  public static final int HEIGHT = 300;
 }
class Pulsanti extends JPanel implements ActionListener
 {
  private JButton startButton = new JButton("START");
  private JButton stopButton = new JButton("STOP");
 
  public Pulsanti()
   {
    add(startButton);
    add(stopButton);
    setBackground(Color.white);
    startButton.addActionListener(this);
    stopButton.addActionListener(this);
   }
  public void actionPerformed(ActionEvent evt)
   {
 
    Object sorgente = evt.getSource();
    if (sorgente == startButton) 
       {
        System.out.println("START");
        repaint();
       }
    else 
       {
        System.out.println("STOP");
       }
 
     }
 
 }
// La classe sottostante non funziona, volevo creare qui la pallina
che rimbalza e la scritta "Sono Ferma"
/*
class Azioni extends JPanel
 {
 
  int centroX = 0;
  int centroY = 0;
  int raggio = 10;
 
  public void paintComponent (Graphics g)
   {
    super.paintComponent (g);
    Graphics2D g2 = (Graphics2D)g;
 
    Ellipse2D pallina = new Ellipse2D.Double();
    pallina.setFrameFromCenter(centroX, centroY, centroX+raggio,
centroY+raggio);
    g2.setPaint(Color.red);    
    g2.fill(pallina);
    g2.draw(pallina);   
   } 
 }
*/

Non è il problema di imbattersi in studenti +/- travestiti..... Quello che
mi spaventa realmente è la preparazione che le nostre scuole danno agli
studenti oggi. Se questi sono i risultati......
Hai ragione, ma che fare? Il beneficio del dubbio tocca darlo a tutti,
altrimenti si rischia di fare un NG di nicchia e chi vuole imparare qualcosa
di nuovo rischia di non avere un valido supporto per cominciare o quanto
meno migliorare le basi.
Si potrebbe suddividere il NG in due categorie : base e avanzato, così da
scremare un minimo, anche per rendere giustizia ai veri professionisti che
spesso si lamentano per la scarsa qualità del NG.
Ciao

 spesso si lamentano per la scarsa qualità del NG.
Non ti curar di loro, ma guarda e passa. :-)
Ciao.
Jigi

Sentite,
voi due mi avete quasi stufata, già mi sono scusata per il mio
comportamento, ho postato il programma che già io avevo cominciato,
ora?
Mi sembra che avete esagerato con le vostre osservazioni, andando
troppo lontano e deducendo cose che non esistono o giudicando in modo
anche maschilista in molti casi!
Cmq non mi volete dare una mano, pazienza, non credo che la mia vità
sarà spacciata, se me  l'avreste data avrei capito prima dove
sbagliavo: sono molto confusa visto che il modo d'insegnamento che stò
vivendo è eccessivamente veloce e su più fronti.
Ok? Scusate ancora, ma smettetela per favore!
J.

Mah!!! Veramente ne io ne Jigi abbiamo fatto riferimento a te!!!!
E poi signorina non ti riscaldare ok ;) ? Se avevamo dei dubbi su chi ci
fosse dietro quel nick, ora ce li hai tolti.
Se puoi e se ne hai vogli, rileggiti per benino quello abbiamo scritto.
Decisamente non abbiamo fatto riferimento a te.
Era tutto legato ai tanti post sul tema, che si sono aperti in questi giorni
(vedi : "NG da Paura" e altri post sopra e sotto di questo).
Se io venissi 100 volte a casa tua a chiederti lo zucchero, tu che mi
risponderesti alla fine? (non rispondere, non oso immaginare) ;)
Ciao :))))))))

L'uomo non č tarzan ma la donna "cita". Giusto ? ;-)