Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Applet] codice ed uso di determinati oggetti

    Salve,

    premetto che sono alle prime armi con gli applet java, quindi avrei bisogno di alcuni consigli riguardo l'editazione del codice per scrivere un applet nella maniera corretta!

    Di seguito posto il codice di un semplice e banale applet che ho scritto (Somma due numeri):

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class AppletSomma extends java.applet.Applet implements ActionListener{
        
        Panel p;
        TextField textOp1, textOp2, ris;
        JButton calcola;
        Label titolo;
        
        public AppletSomma()
        {
        	p=new Panel();
        	p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
        	
        	titolo = new Label("Applet: Somma due numeri");
        	
        	Panel op1 = new Panel();
        	op1.setLayout(new BoxLayout(op1, BoxLayout.X_AXIS));
        	Label titleOp1 = new Label("1° Operando: ");
        	textOp1 = new TextField();
        	
        	op1.add(titleOp1);
        	op1.add(textOp1);
        	
        	Panel op2 = new Panel();
        	op2.setLayout(new BoxLayout(op2, BoxLayout.X_AXIS));
        	Label titleOp2 = new Label("2° Operando: ");
        	textOp2 = new TextField();
        	
        	op2.add(titleOp2);
        	op2.add(textOp2);
        	
        	calcola = new JButton("Calcola somma");
        	calcola.setAlignmentX(JButton.RIGHT);
        	calcola.addActionListener(this);
        	
        	Panel risultato = new Panel();
        	risultato.setLayout(new BoxLayout(risultato, BoxLayout.Y_AXIS));
        	Label titleRis = new Label("Risultato: ");
        	ris= new TextField();
        	
        	risultato.add(titleRis);
        	risultato.add(ris);
        	
        	p.add(titolo);
        	p.add(op1);
        	p.add(op2);
        	p.add(calcola);
        	p.add(risultato);
        	add(p);
        }
        
        /** Initialization
         */
        public void init() 
        {
        	new AppletSomma();
            super.init();
        }
        
        public void start()
        {
        	super.start();
        }
        
        public void actionPerformed(ActionEvent e)
        {
        	Object src = e.getSource();
        	
        	if(src == calcola)
        	{
        		ris.setText((Integer.parseInt(textOp1.getText()) + Integer.parseInt(textOp2.getText()))+"");
        	}
        }
        
    	public void stop()
    	{
    		super.stop();
    	}
    
    
    	public void destroy()
    	{
    		super.destroy();
    	}
    	
    	public void paint(Graphics g)
    	{
    		titolo.setFont(new Font("Arial", Font.BOLD, 16));
    	}
    }
    Bene, vorrei più precisamente dei consigli riguardo l'uso degli oggetti (pannelli e layout) e riguardo l'impostazione della classe.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Applet] codice ed uso di determinati oggetti

    Originariamente inviato da VincenzoTheBest
    Bene, vorrei più precisamente dei consigli riguardo l'uso degli oggetti (pannelli e layout) e riguardo l'impostazione della classe.
    Beh, ci sono diverse cose che non quadrano!

    1) Abituati a mettere le variabili di istanza 'private' (se non ci sono motivi particolari e validi per fare diversamente)

    2) In init() non serve istanziare la tua classe! init() viene invocato già su una istanza della tua classe!
    E tieni presente che init() non viene invocato nel contesto del EDT (event dispatch thread) ma nel contesto di un altro thread, quindi per fare le cose per bene dovresti usare SwingUtilities.invokeAndWait() per far eseguire il codice di inizializzazione nel contesto del EDT.

    3) Non sei obbligato a fare l'override di start(). Metterlo solo per fare super.start() non serve. Idem per stop() e destroy().

    4) Se non devi fare painting diretto nella applet non serve fare l'override di paint(Graphics). E tantomeno servirebbe il setFont() sulla label nel paint(). Se devi impostare font, colori, ecc... che siano "fissi", fallo 1 volta sola in una apposita sezione di inizializzazione.

    5) parseInt() può lanciare NumberFormatException se la stringa è malformata. E siccome la stringa arriva da un campo di testo scrivibile dall'utente, dovresti gestire questa condizione anomala.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Per quanto riguarda i punti 1 e 5: è chiaro che ho scritto l'applet con superficialità! Era solo un esempio .

    Poi per i punti 3 e 4: ok, è tutto chiaro!

    Ma per il secondo ho una domanda:
    va bene comunque se decidessi di creare una classe che estende "Thread" e quindi poi nel momento opportuno istanziare l'oggetto della classe e far partire il thread nel seguente modo?

    codice:
    //in init()
    
    Thr t = new Thr(5);
    t.start();
    
    
    /***************/
    
    
    class Thr extends Thread
    {
          private int param;
    
          public Thr(int param){
            this.param=param;
          }
    
          public void run()
          { ... }
    }
    E' la stessa cosa oppure no?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    va bene comunque se decidessi di creare una classe che estende "Thread" e quindi poi nel momento opportuno istanziare l'oggetto della classe e far partire il thread nel seguente modo?

    E' la stessa cosa oppure no?
    No. Io intendo dire che la inizializzazione della interfaccia grafica (istanziazione e setup dei vari componenti) andrebbe fatta solo nel contesto del EDT. Ma init() non ti viene invocato nel contesto del EDT .... bensì un altro thread creato appositamente dal sistema di plugin nel browser.

    Quindi la soluzione corretta sarebbe:

    codice:
    import java.applet.*;
    import javax.swing.*;
    
    public class TuaApplet extends Applet {
        private JButton button;
        // .... altro ....
    
        public void init() {
            try {
                SwingUtilities.invokeAndWait(new Runnable() {
                    public void run() {
                        setupGUI();
                    }
                });
            } catch (Exception e) {
                System.err.println("Applet initialization failed!");
                e.printStackTrace(System.err);
            }
        }
    
        private void setupGUI() {
            button = new JButton("blabla");
            // .... altri setup ....
        }
    }
    In init() semplicemente chiedo che setupGUI() venga eseguito nel contesto del EDT. E siccome invokeAndWait() può lanciare delle eccezioni, con un try-catch le catturo e poi ne stampo le informazioni su System.err (questo output si può vedere dalla "console" Java fornita dal plugin).
    Nota che il metodo che ho chiamato setupGUI() lo puoi chiamare come ti pare .... sul tutorial della Sun ad esempio lo chiamano createAndShowGUI() e talvolta createGUI().

    Insomma ... il concetto è solo uno: la inizializzazione della interfaccia utente va fatta nel contesto del EDT.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok sei stato chiaro e comunque tutti gli esempi sul sito java.sun sono basati su quel concetto..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.