|
|
|
|
Strumenti |
01-02-2011, 14:53 | #1 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
[JAVA] Posso compilare ed eseguire questa applet fuori dal browser?
Transmission versus Propagation Delay
Codice:
/////////////////////////////////////// //LineSimApllet //written by David Grangier, Institut Eurecom, France //david.grangier@eurecom.fr /////////////////////////////////////// package linesim; //imports import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.applet.*; import java.util.*; //Applet Class public class LineSimApplet extends Applet { //buttons Button start=new Button ("Start"); Button stop=new Button ("Reset"); //features lists MyChoice length=new MyChoice(new String[] {"10 km","100 km","1000 km"},new double[] {10E3,100E3,1E6},3); MyChoice rate=new MyChoice(new String[] {"512 kps","1 Mbps","10 Mbps","100 Mbps"},new double[] {512E3,1E6,10E6,100E6},2); MyChoice size=new MyChoice(new String[] {"100 Bytes","500 Bytes","1 kBytes"},new double[] {8E2,4E3,8E3},1); //to simulate time Thread timerThread; TickTask timerTask; boolean simulationRunning=false; //communication line Line myLine; public void init() { try { setBackground(Color.white); add(new Label ("Length",Label.RIGHT)); add(length); add(new Label("Rate",Label.RIGHT)); add(rate); add(new Label("Packet size",Label.RIGHT)); add(size); //start start.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent event) { launchSim(); } }); add(start); //stop Button stop=new Button ("Reset"); stop.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent event) { stopSim(); //clear line myLine.sendTime(0); //redraw cleared line LineSimApplet.this.repaint(); } }); add(stop); //line myLine= new Line(40,50,450,10); } catch(Exception e) { e.printStackTrace(); } } public void paint (Graphics g) { update(g); // eliminate flashing : update is overriden } public void update (Graphics g) { //work on a offscreen image Dimension offDimension = getSize(); Image offImage = createImage(offDimension.width, offDimension.height); Graphics offGraphics = offImage.getGraphics(); myLine.drawLine(offGraphics); //sender offGraphics.setColor(Color.blue); offGraphics.fillRect(10,40,30,30); offGraphics.setColor(Color.black); offGraphics.drawString("Sender",5,90); offGraphics.drawRect(10,40,30,30); //receiver offGraphics.setColor(Color.blue); offGraphics.fillRect(490,40,30,30); offGraphics.setColor(Color.black); offGraphics.drawString("Receiver",485,90); offGraphics.drawRect(490,40,30,30); offGraphics.drawString("Propagation speed : 2.8 x 10^8 m/sec",175,105); //display offscreen image g.drawImage(offImage, 0, 0, this); } private void launchSim() { setupEnabled(false); //setup line myLine.setup(length.getVal(), rate.getVal() ); myLine.emitPacket(size.getVal(),0); //setup timer timerTask=new TickTask(1E-5,myLine.totalTime()); timerThread=new Thread(timerTask); //start simulation simulationRunning=true; timerThread.start(); } private void stopSim() { timerTask.endNow(); simulationRunning=false; setupEnabled(true); } public void setupEnabled(boolean value) { start.setEnabled(value); length.setEnabled(value); rate.setEnabled(value); size.setEnabled(value); } //my choice class MyChoice extends Choice { private double vals[]; public MyChoice(String items[], double values[],int defaultValue) { for (int i=0; i<items.length;i++) {super.addItem(items[i]);} vals=values; select(defaultValue-1); } public double getVal() {return vals[super.getSelectedIndex()];} } //tickTask class TickTask implements Runnable { private double counter; private double length; private double tick; public TickTask(double t,double l) { length=l; tick=t; counter=0; } public void run() { while (LineSimApplet.this.simulationRunning) { counter+=tick; LineSimApplet.this.myLine.sendTime(counter); LineSimApplet.this.repaint(); if (counter>=length) { LineSimApplet.this.myLine.clearPackets(); LineSimApplet.this.timerThread.suspend(); } try {LineSimApplet.this.timerThread.sleep(50);} catch (Exception e) { } } } public void endNow() { length=counter; } } } //Line class class Line { //graphic variables private int gX; private int gY; private int gWidth; private int gHeight; //characteristic variables final double celerity = 2.8E+8; private double length; private double rate; //simulation variables private double time; private Packet myPacket; public Line(int x, int y, int w, int h) { //graphic init gX=x; gY=y; gWidth=w; gHeight=h; } public void setup(double l, double r) { length=l; rate=r; } void sendTime(double now) { time=now; //update time removeReceivedPackets(now); } void emitPacket(double s, double eT) { myPacket= new Packet(s,eT); } private void removeReceivedPackets(double now) { if (!(myPacket==null)) { if ( now>myPacket.emissionTime+(myPacket.size/rate)+length*celerity ) { clearPackets(); } } } public void clearPackets() { myPacket=null; } public double totalTime() { double emmissionTime=(myPacket.size/rate); double onLineTime=(length/celerity); return (emmissionTime+onLineTime); } public void drawLine(Graphics g) { g.setColor(Color.white); g.fillRect(gX,gY+1,gWidth,gHeight-2); g.setColor(Color.black); g.drawRect(gX,gY,gWidth,gHeight); g.setColor(Color.red); g.drawString(timeToString(time),gX+gWidth/2-10,gY+gHeight+15); drawPackets(g); } private void drawPackets(Graphics g) { if (!(myPacket==null)) { double xfirst; double xlast; //compute time units xfirst=time-myPacket.emissionTime; xlast=xfirst-(myPacket.size/rate); //compute position xfirst=xfirst*celerity*gWidth/length; xlast=xlast*celerity*gWidth/length; if (xlast<0) {xlast=0;} if (xfirst>gWidth ) {xfirst=gWidth;} //draw g.setColor(Color.red); g.fillRect(gX+(int)(xlast),gY+1,(int)(xfirst-xlast),gHeight-2); } } static private String timeToString(double now) { String res=Double.toString(now*1000); int dot=res.indexOf('.'); String deci=res.substring(dot+1)+"000"; deci=deci.substring(0,3); String inte=res.substring(0,dot); return inte+"."+deci+" ms"; } } class Packet { double size; double emissionTime; Packet(double s, double eT) { size=s; emissionTime=eT; } }
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
01-02-2011, 14:57 | #2 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
Forse splittando le classi del file sorgente e usando AppletViewer potrei riuscire, dico questo perchè ho visto che manca un metodo d'ingresso main?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 01-02-2011 alle 14:59. |
02-02-2011, 12:15 | #3 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
up
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
02-02-2011, 14:02 | #4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
L'applet in questione non usa i metodi di connessione al browser quindi puoi tranquillamente considerarlo come un qualsiasi componente awt, con l'unica particolarità del ciclo vitale. Vale a dire che se scrivi:
Applet applet = new LineSimApplet(); Frame frame = new Frame(); frame.add(applet); applet.init(); applet.start(); frame.setSize(800, 600); frame.setVisible(true); Hai la tua applet in finestra. Un test completo apparentemente funzionante è: Codice:
import java.awt.*; import java.awt.event.*; public class Main { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { final LineSimApplet applet = new LineSimApplet(); applet.init(); final Frame frame = new Frame("Wrapper"); frame.add(applet); frame.addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { applet.start(); } public void windowClosing(WindowEvent e) { applet.stop(); applet.destroy(); frame.dispose(); Thread killer = new Thread() { public void run() { try { Thread.sleep(2000); System.exit(0); } catch(Exception ex) {} } }; killer.setDaemon(true); killer.start(); } }); frame.pack(); frame.setSize(frame.getWidth(), 600); frame.setVisible(true); } }); } } |
10-02-2011, 15:53 | #5 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
Mi da errore:
Codice:
Main.java:10: cannot find symbol symbol: class LineSimApplet final LineSimApplet applet = new LineSimApplet(); ^ Main.java:10: cannot find symbol symbol: class LineSimApplet final LineSimApplet applet = new LineSimApplet(); ^ 2 errors Dico questo perchè quel file che ho postato è un file omnicomprensivo.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 10-02-2011 alle 16:03. |
10-02-2011, 16:24 | #6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
50 frustate per l'uso del termine "splittare", ridotte a 25 per "omnicomprensivo".
Non è necessario separare i tipi top level dichiarati nell'unità di compilazione LineSimApplet.java - la lingua permette l'esistenza di più tipi top level nella stessa unità di compilazione purchè uno solo tra essi sia pubblico. Aggiungi tra gli import di "Main.java": import linesim.LineSimApplet Oppure imposta il package di Main a "linesim". O rimuovi il package da LineSimApplet. Puoi anche impacchettare tutto in una sola unità di compilazione, senza package. Codice:
import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Main { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { final LineSimApplet applet = new LineSimApplet(); applet.init(); final Frame frame = new Frame("Wrapper"); frame.add(applet); frame.addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { applet.start(); } public void windowClosing(WindowEvent e) { applet.stop(); applet.destroy(); frame.dispose(); Thread killer = new Thread() { public void run() { try { Thread.sleep(2000); System.exit(0); } catch (Exception ex) { } } }; killer.setDaemon(true); killer.start(); } }); frame.pack(); frame.setSize(frame.getWidth(), 600); frame.setVisible(true); } }); } } class LineSimApplet extends Applet { //buttons Button start = new Button("Start"); Button stop = new Button("Reset"); //features lists MyChoice length = new MyChoice(new String[]{"10 km", "100 km", "1000 km"}, new double[]{10E3, 100E3, 1E6}, 3); MyChoice rate = new MyChoice(new String[]{"512 kps", "1 Mbps", "10 Mbps", "100 Mbps"}, new double[]{512E3, 1E6, 10E6, 100E6}, 2); MyChoice size = new MyChoice(new String[]{"100 Bytes", "500 Bytes", "1 kBytes"}, new double[]{8E2, 4E3, 8E3}, 1); //to simulate time Thread timerThread; TickTask timerTask; boolean simulationRunning = false; //communication line Line myLine; public void init() { try { setBackground(Color.white); add(new Label("Length", Label.RIGHT)); add(length); add(new Label("Rate", Label.RIGHT)); add(rate); add(new Label("Packet size", Label.RIGHT)); add(size); //start start.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { launchSim(); } }); add(start); //stop Button stop = new Button("Reset"); stop.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { stopSim(); //clear line myLine.sendTime(0); //redraw cleared line LineSimApplet.this.repaint(); } }); add(stop); //line myLine = new Line(40, 50, 450, 10); } catch (Exception e) { e.printStackTrace(); } } public void paint(Graphics g) { update(g); // eliminate flashing : update is overriden } public void update(Graphics g) { //work on a offscreen image Dimension offDimension = getSize(); Image offImage = createImage(offDimension.width, offDimension.height); Graphics offGraphics = offImage.getGraphics(); myLine.drawLine(offGraphics); //sender offGraphics.setColor(Color.blue); offGraphics.fillRect(10, 40, 30, 30); offGraphics.setColor(Color.black); offGraphics.drawString("Sender", 5, 90); offGraphics.drawRect(10, 40, 30, 30); //receiver offGraphics.setColor(Color.blue); offGraphics.fillRect(490, 40, 30, 30); offGraphics.setColor(Color.black); offGraphics.drawString("Receiver", 485, 90); offGraphics.drawRect(490, 40, 30, 30); offGraphics.drawString("Propagation speed : 2.8 x 10^8 m/sec", 175, 105); //display offscreen image g.drawImage(offImage, 0, 0, this); } private void launchSim() { setupEnabled(false); //setup line myLine.setup(length.getVal(), rate.getVal()); myLine.emitPacket(size.getVal(), 0); //setup timer timerTask = new TickTask(1E-5, myLine.totalTime()); timerThread = new Thread(timerTask); //start simulation simulationRunning = true; timerThread.start(); } private void stopSim() { timerTask.endNow(); simulationRunning = false; setupEnabled(true); } public void setupEnabled(boolean value) { start.setEnabled(value); length.setEnabled(value); rate.setEnabled(value); size.setEnabled(value); } //my choice class MyChoice extends Choice { private double vals[]; public MyChoice(String items[], double values[], int defaultValue) { for (int i = 0; i < items.length; i++) { super.addItem(items[i]); } vals = values; select(defaultValue - 1); } public double getVal() { return vals[super.getSelectedIndex()]; } } //tickTask class TickTask implements Runnable { private double counter; private double length; private double tick; public TickTask(double t, double l) { length = l; tick = t; counter = 0; } public void run() { while (LineSimApplet.this.simulationRunning) { counter += tick; LineSimApplet.this.myLine.sendTime(counter); LineSimApplet.this.repaint(); if (counter >= length) { LineSimApplet.this.myLine.clearPackets(); LineSimApplet.this.timerThread.suspend(); } try { LineSimApplet.this.timerThread.sleep(50); } catch (Exception e) { } } } public void endNow() { length = counter; } } } //Line class class Line { //graphic variables private int gX; private int gY; private int gWidth; private int gHeight; //characteristic variables final double celerity = 2.8E+8; private double length; private double rate; //simulation variables private double time; private Packet myPacket; public Line(int x, int y, int w, int h) { //graphic init gX = x; gY = y; gWidth = w; gHeight = h; } public void setup(double l, double r) { length = l; rate = r; } void sendTime(double now) { time = now; //update time removeReceivedPackets(now); } void emitPacket(double s, double eT) { myPacket = new Packet(s, eT); } private void removeReceivedPackets(double now) { if (!(myPacket == null)) { if (now > myPacket.emissionTime + (myPacket.size / rate) + length * celerity) { clearPackets(); } } } public void clearPackets() { myPacket = null; } public double totalTime() { double emmissionTime = (myPacket.size / rate); double onLineTime = (length / celerity); return (emmissionTime + onLineTime); } public void drawLine(Graphics g) { g.setColor(Color.white); g.fillRect(gX, gY + 1, gWidth, gHeight - 2); g.setColor(Color.black); g.drawRect(gX, gY, gWidth, gHeight); g.setColor(Color.red); g.drawString(timeToString(time), gX + gWidth / 2 - 10, gY + gHeight + 15); drawPackets(g); } private void drawPackets(Graphics g) { if (!(myPacket == null)) { double xfirst; double xlast; //compute time units xfirst = time - myPacket.emissionTime; xlast = xfirst - (myPacket.size / rate); //compute position xfirst = xfirst * celerity * gWidth / length; xlast = xlast * celerity * gWidth / length; if (xlast < 0) { xlast = 0; } if (xfirst > gWidth) { xfirst = gWidth; } //draw g.setColor(Color.red); g.fillRect(gX + (int) (xlast), gY + 1, (int) (xfirst - xlast), gHeight - 2); } } static private String timeToString(double now) { String res = Double.toString(now * 1000); int dot = res.indexOf('.'); String deci = res.substring(dot + 1) + "000"; deci = deci.substring(0, 3); String inte = res.substring(0, dot); return inte + "." + deci + " ms"; } } class Packet { double size; double emissionTime; Packet(double s, double eT) { size = s; emissionTime = eT; } } |
17-02-2011, 15:23 | #7 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
edit: problemi di linea
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 17-02-2011 alle 16:15. |
17-02-2011, 15:30 | #8 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
Quote:
Perchè meriterebbe lo strappo delle unghie il programmatore autore?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 17-02-2011 alle 16:15. |
|
17-02-2011, 15:36 | #9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Lo strappo deriva da una violazione del bon-ton e da un problema di specifiche.
Convenzionalmente - e in java le convenzioni sono materia quasi religiosa - le unità di compilazione contengono sempre solo un tipo top-level (cioè una classe, interfaccia o enumerativo non contenuto in un altro tipo). Il problema tecnico sta nella mancanza del package perchè le specifiche dichiarano che l'assenza di una dichiarazione di package rende il tipo dichiarato membro di un package liberamente decidibile dalla concreta implementazione della piattaforma java, non necessariamente sempre lo stesso. Sebbene l'implementazione di Sun-Oracle preveda un package ad hoc, che è sempre quello dal 1600 a.C., nulla vieta, ad esempio, che un'implementazione a fronte di due tipi aventi lo stesso nome appartenenti al package "innominato" vengano infilati in spazi dei nomi diversi. In sostanza, quando omettiamo la dichiarazione di package facciamo affidamento ad una convenzione di un'implementazione di Java e non della piattaforma Java in senso stretto. |
17-02-2011, 16:41 | #10 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9945
|
Se vedi sopra ho modificato come mi consigliava Eclipse il codice.
Ma Java non vuole 1 classe 1 file scusa? Come hai fatto a produrre quel main?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
17-02-2011, 17:00 | #11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
No, puoi dichiarare quanti tipi vuoi, purche uno solo tra quelli non contenuti in altri tipi sia pubblico. Cioè puoi tranquillamente dire:
Codice:
//Pippo.java class Giovannone {} class Main {} class Cocoricò {} Codice:
//Pippo.java public class Pippo {} class Giovannone {} class Main {} class Cocoricò {} |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:54.