Newsgroup: it.comp.java
Titolo: Dubbi grossi sul java

Ciao fanciulli,
sono nuovo di questo NG.
Sto facendo la tesi e conosco decentemente c, c++, vc++, vb, indovinate in
quale linguaggio devo sviluppare il progetto per la tesi? Si proprio java
bravi avete indovinato. Premetto che finoa  pochi giorni fa non avevo mai
visto una riga di codice in java, giusto qualche javascript (ma questa è
tutta un'altra roba).
Mi è stato consigliato come manuale elettronico il Mokabook, che però non
riesco a trovare in rete, i link che ho trovato su google mi rimandono tutti
ad una pagina che risulta essere inesistente :-(. Qualcuno sa dove lo posso
trovare?
Premetto uso come ambiente di sviluppo NetBeans 4.1 (consigliato da chi mi
segue nella tesi) e come librerie uso le SWing. La prima parte del
progettino è una specie di paint (quello di windows tanto per intenderci)
fatto come applet.
Questo giusto per iniziare...altro problema:
smanettando un po' e cercando di capire qualche esempio che ho trovato in
rete mi sono messo a fare un'abbozzo dell'applet che dovrei
sviluppare...alcuni dubbi sono emersi:
1)Se metto in un JPanel 2 bottoni e un JcomboBox e poi su questo JPanel ci
devo disegnare con il mouse....per quale assurdo motivo sopra il JComboBox
ci posso disegnare mentre sui bottoni no?
2) Per quale motivo il JComboBox non mi appare appena parte l'applet ma ci
devo cliccare sopra per farlo apparire? (io so dove è e quindi ci posso
cliccare sopra...ma fino a che non ci clicco sopra il JcomboBox non appare)
3) Per quale motivo se inserisco 20 elementi nel Jcombobox in realtà ne vedo
solo 8?
Sembra quasi che i bottoni vengano ridisegnati dopo ogni modifica fatta sul
Jpanel mentre il JCombobox invece viene ridisegnato solo quando avvengono
modifiche su di esso.
Sto cercando di fare tutto non usando l'interfaccia grafica di NetBeans (mi
hanno detto che con netbeans si possono creare i frame come in VB, tra un
po' di giorni ci proverò) per capire veramente cosa ci sta sotto, non voglio
che un'interfaccia grafica mi levi tutto il divertimento, almeno per ora
voglio cercare di capire cosa di nasconde dietro a un bottone o a qualsiasi
altro oggetto posto in un frame, poi quando lo avrò capito allora mi metterò
ad usare l'interfaccia per creare i frame automaticamente.
Vi metto anche il codice tanto sono poche righe...sicuramente sono io che
non ho capito una "seppia" su come funzionano i vari oggetti in java.
Scusate per il post lungo ma non so più dove battere la testa.
So che per voi queste possono sembrare cose banali ma per me che è la prima
volt che le vedo sembrano montagne...quindi chiedo scusa se ho annoiato
qualcuno e se non avete voglia di rispondermi...vi chiederei per favore se
almeno potete darmi un link ad un guida abbastanza esauriente...meglio se in
italiano, se poi c'è solo in inglese mi va bene lo stesso, preferirei non
fosse in babilonese o aramaico :-)).
Ahh dimenticavo ho cercato di ripulire il codice da altre cavolate che avevo
messo, se ce ne sono rimaste altre non preoccupatevi...ora come ora mi
interessa solo capire come funziona il tutto in particolare la sintassi e la
semantica del linguaggio, tralasciando un po' lo stile e la bellezza del
codice.
Ecco qua il codice:
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class JAppletProva extends javax.swing.JApplet implements
MouseMotionListener, ActionListener {
    int x,y;
    int rosso, verde, blu;
    boolean pulisci=false;
    boolean disegna=false;
    JPanel intestazione;
    /** Creates a new instance of JAppletProva */
    public JAppletProva() {
    }
    public void init(){
        intestazione=new JPanel();
        //elementi dell'instestazione
        Button bottonePennello;
        Button bottoneCancella;
        bottonePennello= new Button("Pennello");
        bottoneCancella= new Button("Cancella");
        Vector vettoredimensione = new Vector();
        for (int i=1; i<20;i++){
            vettoredimensione.addElement("Dimensione " +i);
        }
        JComboBox lista=new JComboBox(vettoredimensione);
        intestazione.add(lista);
        intestazione.add(bottonePennello);
        intestazione.add(bottoneCancella);
        intestazione.setBackground(Color.gray);
        getContentPane().add(intestazione);
        addMouseMotionListener(this);
        bottoneCancella.addActionListener(this);
        bottoneCancella.setActionCommand("CANCELLA");
        bottonePennello.addActionListener(this);
        bottonePennello.setActionCommand("PENNELLO");
        intestazione.repaint();
        repaint();
    }
    public void mouseMoved(MouseEvent e){
    }
    public void mouseDragged(MouseEvent e){
        if (disegna==true){
            x=e.getX();
            y=e.getY();
            rosso=10;
            verde=10;
            blu=10;
            repaint();
        }
    }
    public void actionPerformed (ActionEvent e){
        String comando=e.getActionCommand();
        if(comando.compareTo("CANCELLA")==0){
            pulisci=!pulisci;
            repaint();
        }
        if (comando.compareTo("PENNELLO")==0){
            disegna=true;
            repaint();
        }
    }
    public void update (Graphics g){
        paint(g);
    }
    public void paint (Graphics g){
        if (pulisci){
            g.setColor(Color.white);
            g.fillRect(0,0,  getSize().width, getSize().height);
            pulisci=false;
        }
        else{
            g.setColor(new Color(rosso,verde,blu));
            g.fillRect(x,y, 10,10);
        }
    }
}

 ha scritto nel messaggio 
news:4358e549$0$20497$4faf...@reader4.news.tin.it...



Grazie sei stato gentilissimo...mi sono scaricato il mokabook e ho iniziato
a spulciarlo. Appena riesco a capirci qualcosa mi scarico anche il tutorial
sulle Swing.
E meno male che mi dissero che il passaggio da C++ a java era semplice ed
indolore :-((.
Ciao Vinsanto

Me li puoi mandare il primo e il secondo volume please? non riesco a 
loggarmi...
o*m*a*m*a*m*i*a CHIOCCIOLINA t+i+s+c+a+l+i PUNTINO i&t
grazie!
-- 
SERGIO_di_RI0 

 indolore :-((.
Come linguaggio in se il passaggio non e' complicato. In fondo si 
somigliano molto.
Poi perň c'č qualche differenza nell'impostazione di fondo e li le cose 
si fanno un pň piů complicate. Ad esempio i programmatori c++ potrebbero 
si sentono a volte un pň stretti nel lasciare la gestione della memoria 
alla VM e cercano in qualche modo di mantenere il controllo (con piů 
danni che benefici).
Andrea

[CUT]
lascia perdere. sono riuscito a caricarlo.
Grazie lo stesso
-- 
SERGIO_di_RI0 

Per la cronaca ho capito dove sta il problema nel codice che ho scritto nel
primo post.
Tutta la questione č, come mi era stato suggerito da pb, nelle impostazioni
del layout.
Se uso i Panell va tutto bene senza problemi, se uso i JPanel invece succede
del casino, o meglio con i JPanel non riesco a impostare il layout che
voglio io e assegnare a alle varie parti un JPanel. Sembra che ci siano
problemi con la seguente sintassi:
questa č ok:
Panel NorthPanel=new Panel;
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add("North",NorthPanel);
questa NON č ok:
JPanel NorthPanel=new JPanel;
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add("North",NorthPanel);
Ora mi metto nella lettura del manuale sulle Swing e vediamo se riesco a
tirarci fuori qualcosa.
Scusate ancora per il disturbo.
Ciao
Vinsanto

 Scusate ancora per il disturbo.
Ok problema risolto è bastato leggere 3 righe del manuale della SUN, sulla
sintassi delle SWING.
La prossima volta posterò solo dopo essermi letto il manuale per evitare dei
RTFM, che a questo giro mi sarei meritato.
Ciao
Vinsanto

         }
/** perchè usi il vecchio vector?  usa l'arraylist è molto meglio ed ha più
metodi */
Per il resto niente da dire, la grafica che usi è ovviamente quella vecchia
pure.
ciao

 writes:
A> Come linguaggio in se il passaggio non e' complicato. In fondo si
A> somigliano molto.
Sono ad oggetti  ed hanno una sintassi simile, non  lo userei per dire
"si assomigliano molto".
E non penso  che ci sia solo la gestione della  memoria, già non avere
oggetti statici può "infastidire":
* in C++ se  non ricordo male (non mi piace  molto come linguaggio) un
  metodo deve essere definito esplicitamente virtuale, in Java no;
* il C++ può essere usato in modo non OO, Java no;
* il  C++  permette  ereditarietà  multipla  e  lascia  il  problemone
  dell'ereditarietà a  diamante, Java  taglia la testa  al toro  e non
  permette l'ereditarietà  multipla dato che  con l'implementazione di
  un  interfaccia  ed un  oggetto  delegato  si  ottengono gli  stessi
  effetti;
* il C++ compila questo
        register n = (count + 7) / 8;      
        /* count > 0 assumed */
        switch (count % 8)
        {
        case 0:        do {  *to++ = *from++;
        case 7:              *to++ = *from++;
        case 6:              *to++ = *from++;
        case 5:              *to++ = *from++;
        case 4:              *to++ = *from++;
        case 3:              *to++ = *from++;
        case 2:              *to++ = *from++;
        case 1:              *to++ = *from++;
                           } while (--n > 0);
        }
  Java  no :)  (Sturmtruppen          roustroup lo  usa come
  esercizio)
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 ha scritto nel messaggio
news:TDf6f.2493$65.7...@twister1.libero.it...

TRatto da "Handbook Java2" di Horstmann& Cornell

   esercizio)
Già e il bello è che veniva giustificato perché più performante ;-)
Andrea

> }
A> Già e il bello è che veniva giustificato perché più performante ;-)
<OT>
Beh, quella  simpatica bestiolina è  uno srotolamento di loop  fatto a
livello di  codice ma che ora i  compilatori sono in grado  di fare da
soli.
La  versione originale  di Tom  Duff aveva  statement del  tipo  *to =
*from++ e serviva  a sparare i dati su una porta  di I/O memory mapped
alla  massima  velocità  possibile  e  venne  scritta  credo  per  una
architettura  CISC  tradizionale  (ovvero  non  Intel).  E  su  quelle
macchine l'assembler risultante  era compattissimo e molto efficiente,
riducendo tra l'altro il numero di salti ad 1/8 di quelli richiesti dal
loop tradizionale.
Non so se con la JVM si potrebbero fare delle "economie" del genere...
</OT>


 </OT>
Avrebbe ancora meno senso. Il bello di una JVM è che può utilizzare un 
compilatore JIT che può permettersi ottimizzazioni che un compilatore 
normale non si può sognare.
In tal caso, oltre ad avere informazioni precisissime sulla piattaforma 
(modello esatto del processore, quantità di memoria a disposizione, 
ecc.) si hanno informazioni anche sull'esecuzione (questo metodo viene 
invocato tantissime volte da questi punti e quindi è conveniente fare un 
inline del codice).
Figurarsi se lo srotolamento manuale di un loop può avere senso (anche 
se tutto dipende, come sempre, dalle circostanze).
In linguaggi come Java, e soprattutto con la complessità raggiunta dalle 
applicazioni, l'ottimizzazione deve puntare in genere in ben altre 
direzioni.
Andrea

 writes:
A> Oppure usi solo metodi statici oppure utilizzi si gli oggetti ma
A> più come moduli che come oggetti veri e propri.
A> E' vero devi usare degli accrocchi, ma non porre limiti alla
A> fantasia di un programmatore mediocre.  Purtroppo in questo periodo
A> ho a che fare, per lavoro, con un certo numero di programmatori
A> poco esperti: ne sto vedendo di tutti i colori.  Mi viene da dire
A> "Ho visto cose che voi umani ..."
Piena e sincera solidarietà.
A> Figurarsi se lo srotolamento manuale di un
A> loop può avere senso (anche se tutto dipende, come sempre, dalle
A> circostanze).
Non  ha senso  perché,  tanto per  cominciare,  tra il  tuo codice  in
bytecode e la pipeline del processore c'è "troppa roba".
Quando Duff (allora in Lucasfilm, e mi pare l'unico non AT&T Bell Labs
citato nel libro "The Unix Developer Environment" di Kernigham & Pike)
ha  scritto quel loop  il codice  risultante dello  srotolamento erano
esattamente otto  move, un  decremento ed un  branch, con  puntatori e
contatore nei registri del processore. Era il migliore loop possibile.
Il discorso originale  sul Duff's device era comunque  mirato al fatto
che in  C e C++ è codice  perfettamente legale(1) mentre in  Java si è
deciso di renderlo illegale.
(1) Tom  Duff disse "This  code forms  some sort  of argument  in that
   debate, but  I'm not sure whether  it's for or  against." - "Questo
   codice  è  un  certa   forma  di  argomento  nella  dibattito  [sul
   falltrought dello statement switch()], ma non so bene se a favore o
   contro"
A> In linguaggi come Java, 
Con Java senza dubbio!
Java non ha una CPU virtuale  paragonabile ai VAX, magari senza il JIT
ridurre il numero di branch  fa guadagnare ancora qualcosa o magari no
(dovrei  guardare meglio  come è  fatta). Da  quel poco  che  ho visto
(articoli di 8 anni fa e  qualche esempio di bytecode) la differenza è
tanta.
A> e soprattutto con la complessità raggiunta dalle applicazioni,
A> l'ottimizzazione deve puntare in genere in ben altre direzioni.
L'ottimizzazione fatta (bene) dagli umani sui loro programmi segue per
ogni  programma una sua  via, prima  si individuano  le parti  dove il
programma  passa il maggior  tempo, si  guarda se  si sono  scelti gli
algoritmi  migliori e  quindi si  individuano i  punti in  cui  si può
operare lavorando  sul codice. E su quest'ultimo  oramai i compilatori
sono spesso più bravi degli umani :).
