Lezione 5 - Perche' Swing?Non bastava Awt?


Tutte le applicazioni in questa lezione sono state prese dai materiali del seminario tenuto al Cern da Raúl Ramos-Pollán.Allo stesso indirizzo al Cern e' disponibile una copia zippata dello stesso materiale, mentre la S accanto al titolo di ogni applicazione punta a una copia locale dello stesso materiale.
Intanto occorre chiarire che Swing si basa su Awt e quindi va considerato come un'estensione piu' che una sostituzione(anche se rende molte classi di AWT obsolete).Le ragioni principali per l'introduzione di Swing possono essere considerate : A tutti gli oggetti grafici AWT corrisponde un oggetto Swing il cui nome si ottiene aggiungendo una J all'inizio:ad esempio a Button corrisponde JButton. Gli oggetti grafici Swing derivano tutti dall'oggetto AWT Container e si dispongono nel modo seguente in un JFrame. Prima va definito un JPanel per il frame. Quindi un LayoutManager per il JPanel e quindi tutti gli oggetti vengono aggiunti al JPanel.


Applicazione 1:Costruisci la seguente interfaccia Swing.S

    file MyApplication.java

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

public class MyApplication {

  public static void main (String args[]) {

        // Create the frame
   	JFrame frame = new JFrame ("My Application");

   	// Create some components
   	JButton b1 = new JButton("A Button");
   	b1.setToolTipText("This is the left button");

   	JButton b2 = new JButton(new ImageIcon("middle.gif"));
   	b2.setToolTipText("This is the middle button");

	JLabel label  = new JLabel(new ImageIcon("alb.gif"));

        JTextField text = new JTextField(20);

        Vector items = new Vector();
        for (int i=1; i<20; i++) {
		items.addElement("This is item "+i);
        }
        JList list = new JList(items);
        list.setToolTipText("Select one item");
 	JScrollPane listPane = new JScrollPane(list);

        //Lay out the content pane.
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new FlowLayout());
        contentPane.setPreferredSize(new Dimension(300, 300));
        contentPane.add(b1);
        contentPane.add(b2);
	contentPane.add(label);
        contentPane.add(text);
 	contentPane.add(listPane);
        frame.setContentPane(contentPane);
      	frame.pack();
      	frame.show();
   }
}

Swing fa parte delle Java Foundation Classes ed e' diventato parte integrante di Java solo con la versione 2. Percio' per la sua documentazione bisogna riferirsi a questa versione.
Ma e' stato possibile in passato usare Swing anche con la versione 1.1 utilizzando una libreria di classi aggiuntiva che si scaricava dalla Sun.
I programmi Swing hanno percio' talvolta una diversa istruzione import : import javax.swing.*;(versione finale) oppure import com.sun.java.swing.*; (versioni precedenti del jdk).


Applicazione 2:Generalizzate l'applicazione precedente in modo da poter instanziare un numero qualsiasi di finestre simili S

    file FirstSample.java

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

public class FirstSample extends JPanel {

  public FirstSample() {

        super();
   	// Create some components
   	JButton b1 = new JButton("A Button");
   	b1.setToolTipText("This is the left button");

   	JButton b2 = new JButton(new ImageIcon("middle.gif"));
   	b2.setToolTipText("This is the middle button");

	JLabel label  = new JLabel(new ImageIcon("alb.gif"));

        JTextField text = new JTextField(20);

        Vector items = new Vector();
        for (int i=1; i<20; i++) {
		items.addElement("This is item "+i);
        }
        JList list = new JList(items);
        list.setToolTipText("Select one item");
 	JScrollPane listPane = new JScrollPane(list);

        //Lay out the content pane.
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(300, 300));
        add(b1);
        add(b2);
	add(label);
        add(text);
 	add(listPane);
   }
   public static void main (String args[]) {
	JFrame frame = new JFrame("First Sample");
        frame.setContentPane(new FirstSample());
      	frame.pack();
      	frame.show();

	JFrame frame2 = new JFrame("Another First Sample");
	frame2.setContentPane(new FirstSample());
        frame2.pack();
	frame2.show();
   }
}

In Swing abbiamo 2 tipi di oggetti grafici: i contenitori "di alto livello" JFrame e JWindow e i normali componenti(tutti gli altri). Non e' possibile aggiungere a un contenitore di alto livello un componente.I componenti vanno sempre aggiunti a un Panel e nel panel si specifica anche il Layout manager. Per questo motivo conviene dividere la classe che instanzia il frame dalla classe che estende il Panel per creare l'interfaccia.


Applicazione 3:Costruisci un ToolBar Swing. S

    file ToolBarSample.java

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

public class ToolBarSample extends JPanel {

  public ToolBarSample () {
	super();

        // Create a toolbar
	JToolBar mybar = new JToolBar();
	mybar.add(new JButton(new ImageIcon("open.gif")));
	mybar.add(new JButton(new ImageIcon("save.gif")));

	JButton cut = new JButton(new ImageIcon("cut.gif"));
	cut.setToolTipText("Cut Selection");
	JButton copy = new JButton(new ImageIcon("copy.gif"));
	copy.setToolTipText("Copy Selection");
	mybar.add(cut);
	mybar.add(copy);

   	// Create some components
	JLabel label  = new JLabel(new ImageIcon("alb.gif"));
        JTextArea text = new JTextArea();

        //Lay out the content pane.
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(300, 300));
	add("North", mybar);
	add("South", label);
        add("Center", text);
   }

  public static void main (String args[]) {
        // Create the frame and the content
        JFrame frame = new JFrame ("My Application");
	ToolBarSample tb = new ToolBarSample();

        frame.setContentPane(tb);
        frame.pack();
        frame.show();
 }

}




Applicazione 4:Usa un contenitore ScrollPane. S

    file ScrollSample.java

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



public class ScrollSample extends JPanel {

  public ScrollSample() {
        JTextArea text = new JTextArea();
        JScrollPane textPane = new JScrollPane(text);

        //Lay out the pane.
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(300, 300));
        add("Center", textPane);
   }

  public static void main (String args[]) {

        // Create the frame
   	JFrame frame = new JFrame ("My Application");
	ScrollSample scroll = new ScrollSample();
        frame.setContentPane(scroll);
      	frame.pack();
      	frame.show();
   }
}


ScrollPane e' un contenitore generico che puo' contenere qualsiasi cosa che vorremmo poter scorrere(testo,immagini,...).


Applicazione 5:Costruisci una JTable. S

    file TableSample.java

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

class MyTableModel extends AbstractTableModel {
          public int getColumnCount() { return 10; }
          public int getRowCount() { return 10;}
          public Object getValueAt(int row, int col) { return new Integer(row*col); }
}

public class TableSample extends JPanel {

  public TableSample() {
      super();

      MyTableModel dataModel = new MyTableModel();
      JTable table = new JTable(dataModel);
table.setPreferredScrollableViewportSize(new Dimension(300, 100));
      JScrollPane scrollpane = new JScrollPane(table);

        //Lay out the content pane.
        setLayout(new FlowLayout());
//        setPreferredSize(new Dimension(350, 300));
	add(scrollpane);
   }
   public static void main (String args[]) {

        // Create the frame
        JFrame frame = new JFrame ("Table Sample");

        frame.setContentPane(new TableSample());
      	frame.pack();
      	frame.show();
   }
}


         




Applicazione 6:Costruisci un JTree. S

    file TreeSample.java

import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;

public class TreeSample extends JPanel {

  public TreeSample() {
	super();	

 	// Create the tree structure
	DefaultMutableTreeNode top = new DefaultMutableTreeNode("The root of all");
	DefaultMutableTreeNode primo = 
	   new  DefaultMutableTreeNode ("The First Node");
	top.add(primo);
	primo.add(new DefaultMutableTreeNode ("The first in the first"));
	primo.add(new DefaultMutableTreeNode ("The second in the first"));

	DefaultMutableTreeNode second =
	   new  DefaultMutableTreeNode ("The Second Node");
	top.add(second);
	second.add(new DefaultMutableTreeNode ("The first in the second"));
	second.add(new DefaultMutableTreeNode ("The second in the second"));

        DefaultMutableTreeNode category = 
	   new  DefaultMutableTreeNode ("Category");
	second.add(category);
	category.add(new DefaultMutableTreeNode("Bussines"));
	category.add(new DefaultMutableTreeNode ("Science"));
	
	JTree tree = new JTree(top);
        JScrollPane scrollpane = new JScrollPane(tree);

        //Lay out the content pane.
        setLayout(new BorderLayout());
	setPreferredSize(new Dimension(350,300));
	add("Center", scrollpane);
   }
   public static void main (String args[]) {
	TreeSample app = new TreeSample();
	JFrame frame = new JFrame ("My Application");
	frame.setContentPane(app);
	frame.pack();
	frame.show();
   }
}




Applicazione 7:Costruisci un JSplitPanel. S

    file SplitSample.java

import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
public class SplitSample extends JPanel {
  public SplitSample() {	super();
		JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
	TreeSample tree = new TreeSample();
	ScrollSample text = new ScrollSample();
	pane.setLeftComponent(tree);
	pane.setRightComponent(text);
  	pane.setDividerLocation(150);
	pane.setDividerSize(10);
		        //Lay out the content pane.
        setPreferredSize(new Dimension(350, 300));
	setLayout(new GridLayout(1,1));
	add(pane, new Dimension(1,1));
   }
   public static void main (String args[]) {	SplitSample app = new SplitSample();
	JFrame frame = new JFrame ("My Application");
	frame.setContentPane(app);
	frame.pack();
	frame.show();
   }}
SplitPanel e' un contenitore generico che permette a 2 altri componenti di condividere lo stesso spazio con un separatore in mezzo che si puo' spostare a piacere.


Applicazione 8:Costruisci un JTabPanel. S

    file TabbedSample.java


import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;


import java.awt.*;

public class TabbedSample extends JPanel {

  public TabbedSample() {
	super();	

	JTabbedPane tpane = new JTabbedPane();

	tpane.addTab("ScrollSample", new ImageIcon("open.gif"),
		     new ScrollSample(), "The Previous Scroll Sample");
	tpane.addTab("SplitSample", null,
	             new SplitSample(), null);
	tpane.addTab("TreeSample", new ImageIcon("save.gif"),
	             new TreeSample(), "The Tree Sample");		
        tpane.addTab("TableSample", null,
                     new TableSample(), "The Table Sample");

        //Add the tabbed pane to this panel.
        setLayout(new GridLayout(1, 1)); 
        add(tpane);
   }
   public static void main (String args[]) {
	TabbedSample app = new TabbedSample();
	JFrame frame = new JFrame ("My Application");
	frame.setContentPane(app);
	frame.pack();
	frame.show();
   }
}


         
TabPanel permette a un numero qualsiasi di componenti di condividere lo stesso spazio.


Applicazione 9:Costruisci un vero e proprio desktop. S

    file InternalFrameSample.java

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

public class InternalFrameSample extends JFrame implements ActionListener{

  JDesktopPane desktop;
  JButton b1, b2, b3, b4, b5;
  int offsetx=50; int offsety=50;
  public InternalFrameSample() {
	super("Internal Frame Demo");	

	desktop = new JDesktopPane();

	JToolBar toolbar = new JToolBar();
	b1 = new JButton ("Scroll Sample");
	b2 = new JButton ("Split Sample");
	b3 = new JButton ("Tree Sample");
	b4 = new JButton ("Table Sample");
	b5 = new JButton ("Tabs Sample");

        toolbar.add(b1);  b1.addActionListener(this);
        toolbar.add(b2);  b2.addActionListener(this);
        toolbar.add(b3);  b3.addActionListener(this);
	toolbar.add(b4);  b4.addActionListener(this);
        toolbar.add(b5);  b5.addActionListener(this);

        //Add the desktop pane to this panel.
	desktop.setLayout(new BorderLayout());
	desktop.add("North", toolbar);
	setContentPane(desktop);
   }

   public void actionPerformed (ActionEvent e) {
	JInternalFrame frame;
	if (e.getSource() == b1) {
	    createInternalFrame("Scroll", new ScrollSample());
        } else if (e.getSource() == b2) {
	    createInternalFrame("Split", new SplitSample());
        } else if (e.getSource() == b3) {
	    createInternalFrame("Tree", new TreeSample());
        } else if (e.getSource() == b4) {
	    createInternalFrame("Table", new TableSample());
	} else if (e.getSource() == b5) {
	    createInternalFrame("Tab", new TabbedSample());
        }
   }

   public void createInternalFrame(String title, Container what) {
           JInternalFrame fr = new JInternalFrame(title, true, true, true, true);
           fr.setContentPane(what);
           fr.setSize(300,300);
           fr.setLocation(offsetx,offsety);
	   offsetx = offsetx+20;
	   offsety = offsety+20;
	   
           desktop.add(fr);
           try {
            fr.setSelected(true);
           } catch (java.beans.PropertyVetoException e2) {}
           fr.setVisible(true);
   }

	   
   public static void main (String args[]) {
	InternalFrameSample frame = new InternalFrameSample();
	frame.pack();
	frame.show();
   }
}


         
DesktopPane permette di realizzare un vero e proprio desktop. Notate come il trattamento degli eventi e' quello di AWT.


Applicazione 10:Mostra la capacita' di Swing di poter cambiare di aspetto (Look and Feel) schiacciando un bottone. S

    file InternalFrameSample.java

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

public class InternalFrameSample extends JFrame implements ActionListener{

  JDesktopPane desktop;
  JButton b1, b2, b3, b4, b5, b6, b7,b8;
  int offsetx=50; int offsety=50;
  public InternalFrameSample() {
	super("Internal Frame Demo");	

	desktop = new JDesktopPane();

	JToolBar toolbar = new JToolBar();
	b1 = new JButton ("Scroll");
	b2 = new JButton ("Split");
	b3 = new JButton ("Tree");
	b4 = new JButton ("Table");
	b5 = new JButton ("Tabs");
	b6 = new JButton ("Motif LF");
        b7 = new JButton ("Metal LF");
	b8 = new JButton ("Windows LF");

        toolbar.add(b1);  b1.addActionListener(this);
        toolbar.add(b2);  b2.addActionListener(this);
        toolbar.add(b3);  b3.addActionListener(this);
	toolbar.add(b4);  b4.addActionListener(this);
        toolbar.add(b5);  b5.addActionListener(this);
        toolbar.add(b6);  b6.addActionListener(this);
        toolbar.add(b7);  b7.addActionListener(this);
	toolbar.add(b8);  b8.addActionListener(this);

        //Add the desktop pane to this panel.
	desktop.setLayout(new BorderLayout());
	desktop.add("North", toolbar);
	setContentPane(desktop);
   }

   public void actionPerformed (ActionEvent e) {
	JInternalFrame frame;
	if (e.getSource() == b1) {
	    createInternalFrame("Scroll", new ScrollSample());
        } else if (e.getSource() == b2) {
	    createInternalFrame("Split", new SplitSample());
        } else if (e.getSource() == b3) {
	    createInternalFrame("Tree", new TreeSample());
        } else if (e.getSource() == b4) {
	    createInternalFrame("Table", new TableSample());
	} else if (e.getSource() == b5) {
	    createInternalFrame("Tab", new TabbedSample());
        } else if (e.getSource() == b6) {
	    changeLF(1);
        } else if (e.getSource() == b7) {
            changeLF(2);
        } else if (e.getSource() == b8) {
	    changeLF(3);
        }
   }

   public void changeLF(int what) {
        String lf ="";
          if (what==1) { lf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";}
     else if (what==2) { lf = "javax.swing.plaf.metal.MetalLookAndFeel";}
     else if (what==3) { lf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";}
     try {
	UIManager.setLookAndFeel(lf);
     	SwingUtilities.updateComponentTreeUI(this);
     } catch(Exception e) { e.printStackTrace(); }
  } 

	

   public void createInternalFrame(String title, Container what) {
           JInternalFrame fr = new JInternalFrame(title, true, true, true, true);
           fr.setContentPane(what);
           fr.setSize(300,300);
           fr.setLocation(offsetx,offsety);
	   offsetx = offsetx+20;
	   offsety = offsety+20;
	   
           desktop.add(fr);
           try {
            fr.setSelected(true);
           } catch (java.beans.PropertyVetoException e2) {}
           fr.setVisible(true);
   }

	   
   public static void main (String args[]) {
	InternalFrameSample frame = new InternalFrameSample();
	frame.pack();
	frame.show();
   }
}


         
Per ottenere questa flessibilita' dietro i componenti Swing c'e' una filosofia completamente diversa da Awt.Questa filosofia si puo' riassumere dicendo che i componenti Swing sono lightweight. Per comprendere la differenza con AWT cominciamo a vedere come viene disegnato un componente AWT: Per ogni componente sono forniti 2 oggetti:
  1. Un oggetto "logico" che contiene la descrizione ad alto livello
  2. un oggetto "Peer" che contiene le istruzioni necessarie per disegnare l'oggetto o per meglio dire le istruzioni da dare alla particolare piattaforma per fare il disegno,in quanto il disegno stesso e' lasciato fare al Sistema Operativo del particolare computer dove ci troviamo.
Un componente Swing viene implementato usando 4 oggetti,ognuno dei quali si occupa di un particolare aspetto e ognuno dei quali puo' essere modificato.
nome implementamodificandolo possiamo cambiareEsempio
Model ObjectModello dei dati e dello stato i datiTableModel definisce i dati da caricare in una tabella
ChangeListenerIndica cosa fare quando il modello cambia
ComponentObjectRappresentazione dell'oggetto:prende i dati dai 2 oggetti precedentiLe proprieta' fisiche dell'oggettoJTable
UI ObjectRappresentazione dell'oggetto:fa l'effettivo disegno prendendo i dati dall'oggetto precedenteIl Look e Feel dell'oggetto
Si dice che i primi 2 oggetti definiscono il modello del componente, mentre gli ultimi due ne definiscono l'apparenza(view)


Applet 11:Riscrivete l'applicazione 6 come Applet. S

Guardate l'applet in funzione


import java.util.*;
import javax.swing.tree.*;
import javax.swing.*;
import java.awt.*;

public class EsempioTree extends JApplet {
 

         public void init() {

 	// Create the tree structure
	DefaultMutableTreeNode top = new DefaultMutableTreeNode("The root of all");
	DefaultMutableTreeNode primo = 
	   new  DefaultMutableTreeNode ("The First Node");
	top.add(primo);
	primo.add(new DefaultMutableTreeNode ("The first in the first"));
	primo.add(new DefaultMutableTreeNode ("The second in the first"));

	DefaultMutableTreeNode second =
	   new  DefaultMutableTreeNode ("The Second Node");
	top.add(second);
	second.add(new DefaultMutableTreeNode ("The first in the second"));
	second.add(new DefaultMutableTreeNode ("The second in the second"));

        DefaultMutableTreeNode category = 
	   new  DefaultMutableTreeNode ("Category");
	second.add(category);
	category.add(new DefaultMutableTreeNode("Bussines"));
	category.add(new DefaultMutableTreeNode ("Science"));
	
	JTree tree = new JTree(top);
        JScrollPane scrollpane = new JScrollPane(tree);

        //Lay out the content pane.
        getContentPane().setLayout(new BorderLayout());
	scrollpane.setPreferredSize(new Dimension(350,300));
	getContentPane().add("Center", scrollpane);
    }
}



Applet 12:Riscrivete l'applet 17 della lezione precedente sostituendo l'interfaccia AWT con un'interfaccia Swing . S

Guardate l'applet in funzione


import  java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Pick1 extends JApplet implements ActionListener{
 int maxcol = 158;
 Color col[]=new Color[maxcol];
 PickCanvas disegno;
 Button b1;
 Panel p1,p2;
 TextField c1val,c2val;
 Label l1,l2;
 double c1,c2;

public void init(){
   c1 = Math.random()-5.;
   c2 = Math.random()-5.;
   Julia1.setcol(col);
   disegno = new PickCanvas(this);
   
   p1 = new Panel(); 
   p1.add(l1 = new Label("c1"));
   p1.add(c1val=new TextField(5));
   c1val.setText(Double.toString(c1));    
   p1.add(l2 = new Label("c2"));
   p1.add(c2val=new TextField(5));
   c2val.setText(Double.toString(c2));    
   p2 = new Panel(); 
   p2.add(b1 = new Button("Disegna"));
   b1.addActionListener(this);
   getContentPane().setLayout(new BorderLayout());
   getContentPane().add("North",p1);  
   getContentPane().add("Center",disegno);
   getContentPane().add("South",p2);  
   disegno.repaint();
 
}
public void actionPerformed(ActionEvent e){
  c1 = Double.valueOf(c1val.getText()).doubleValue();
  if(c1<-5.)c1=-5.;
  if(c1 > -.4)c1=-4.;
  c2 = Double.valueOf(c2val.getText()).doubleValue();
  if(c2<-5.)c2=-5.;
  if(c2 > -.4)c2=-4.;
  disegno.repaint();

}
}
class PickCanvas extends JPanel{
  Pick1 appl;
PickCanvas(Pick1 appl1){
   super();
   appl=appl1;
   }
public void paintComponent(Graphics g){
   super.paintComponent(g);
   int i,j,ncol;

    for(i=0;i<getSize().width;i++){
      for(j=0;j<getSize().height;j++){
              ncol = (int)(appl.c1*(Math.sin(-11.+appl.c2*i)+Math.sin(-12.+appl.c2*j)));
              ncol = Math.abs(ncol)%appl.maxcol+1;
              g.setColor(appl.col[ncol]);
              g.fillRect(i,j,1,1);
              }
       }
}
}

Se i componenti Swing sono lightweight essi non sono purtroppo leggeri in termini di consumo di risorse. Un programma Swing e' molto piu' lento e voluminoso di un programma AWT. Questo e' un problema specie per gli applet che gia' sono penalizzati dalla lentezza di Java. Un'alternativa leggera in termini di consumo di risorse a Java e' Javascript. Se potete fare qualcosa anche in Javascript, allora non pensateci 2 volte, fatelo in Javascript. Purtroppo Javascript e' limitato e non permette di fare molte cose. E' possibile pero con le ultime versioni dei browsers scrivere una rudimentale interfaccia per un programma Java direttamente in Javascript.


Applet 13:Riscrivete l'applet 17 della lezione precedente sostituendo l'interfaccia AWT con un'interfaccia Javascript . S

Guardate l'applet in funzione

import  java.awt.*;
import java.applet.*;
public class Pick2 extends Applet {
 int maxcol = 158;
 Color col[]=new Color[maxcol];
 PickCanvas2 disegno;
 Panel p1;
 TextField c1val,c2val;
 Label l1,l2;
 double c1=-4.5,c2=-4.5;

public void init(){
   p1 = new Panel(); 
   p1.add(l1 = new Label("c1"));
   p1.add(c1val=new TextField(5));
   c1val.setText(Double.toString(c1));    
   p1.add(l2 = new Label("c2"));
   p1.add(c2val=new TextField(5));
   c2val.setText(Double.toString(c2));    
   Julia1.setcol(col);
   disegno = new PickCanvas2(this);
   setLayout(new BorderLayout());
   add("North",p1);  
   add("Center",disegno);
   disegno.repaint();
 
}
public void startdisegno(String s1,String s2){
   System.out.println(s1+" "+s2);
   c1 = Double.valueOf(s1).doubleValue();     
   c2 = Double.valueOf(s2).doubleValue();     
   c1val.setText(Double.toString(c1));    
   c2val.setText(Double.toString(c2));    
   disegno.repaint();
}

public void startrandom(){
   c1 = Math.random()-5.;
   c1val.setText(Double.toString(c1).substring(0,5));    
   c2 = Math.random()-5.;
   c2val.setText(Double.toString(c2).substring(0,5));    
   disegno.repaint();
}


class PickCanvas2 extends Canvas{
  Pick2 appl;
PickCanvas2(Pick2 appl1){
   super();
   appl=appl1;
   }
public void paint(Graphics g){
    int i,j,ncol;

    for(i=0;i < getSize().width;i++){
      for(j=0;j < getSize().height;j++){
              ncol = (int)(appl.c1*(Math.sin(-11.+appl.c2*i)+Math.sin(-12.+appl.c2*j)));
              ncol = Math.abs(ncol)%appl.maxcol+1;
              g.setColor(appl.col[ncol]);
              g.fillRect(i,j,1,1);
              }
       }
}
}
}

INDIETRO a Imparate Java in una settimana
INDIETRO a Seminario su Java
Maintained by : info@zitogiuseppe.com
Ultimo aggiornamento: