PDA

View Full Version : [Java]Convertire Applet in Applicazione


Voltron
27-04-2007, 09:52
Ciao a tutti!
Come da titolo, avrei bisogno di convertire una applet in una applicazione; ho letto che devo creare un jframe che funga da contenitore, e copiare dentro il metodo 'init' del frame il contenuto dell'init dell'applet, ed inserire (sempre nel frame) gli altri metodi presenti nell'applet......Ma non funziona!:muro:

questo è il codice dell'applet da convertire in applicazione:

import java.applet.Applet;
import java.awt.*;

public class BellmanFord extends Applet
{

public BellmanFord()
{
graphcanvas = new GraphCanvas(this);
options = new Options(this);
documentation = new Documentation(this);
routeTable = new RouteTable();
}

public void init()
{
setLayout(new BorderLayout(10, 10));
add("Center", graphcanvas);
add("North", documentation);
add("East", options);
add("South", routeTable);
}

public Insets insets()
{
return new Insets(10, 10, 10, 10);
}

public void lock()
{
graphcanvas.lock();
options.lock();
}

public void unlock()
{
graphcanvas.unlock();
options.unlock();
}

GraphCanvas graphcanvas;
Options options;
Documentation documentation;
RouteTable routeTable;
}


Questo è il codice del frame(in grassetto le parti che ho aggiunto):


public class JFrame extends javax.swing.JFrame {

/** Creates new form JFrame */
public JFrame() {
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);

add("Center", graphcanvas);
add("North", documentation);
add("East", options);
add("South", routeTable);

pack();

}// </editor-fold>//GEN-END:initComponents

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
GraphCanvas graphcanvas;
Options options;
Documentation documentation;
RouteTable routeTable;
}


Qualcuno saprebbe indicarmi cosa aggiungere/modificare??

^TiGeRShArK^
27-04-2007, 11:04
non vorrei deire una cavolata..
ma le Applet usano AWT, mentre il JFrame è un componente di swing...
hai provato ad usare un Frame anzichè un JFrame? :fagiano:

andbin
27-04-2007, 11:10
Come da titolo, avrei bisogno di convertire una applet in una applicazione; ho letto che devo creare un jframe che funga da contenitore, e copiare dentro il metodo 'init' del frame il contenuto dell'init dell'applet, ed inserire (sempre nel frame) gli altri metodi presenti nell'applet......Ma non funziona!:muro: Guarda, il concetto sarebbe molto semplice: estendere Frame/JFrame piuttosto che Applet/JApplet.
La questione comunque è anche un'altra: la tua applet usa Swing oppure AWT?? Visto che estende Applet, io deduco AWT. Dal tuo codice poi non è possibile capire cosa sono GraphCanvas, RouteTable, ecc....

Una cosa del genere (codice non testato!):
import java.awt.*;

public class BellmanFord extends Frame
{
private GraphCanvas graphcanvas;
private Options options;
private Documentation documentation;
private RouteTable routeTable;

public BellmanFord ()
{
super ("Un titolo");
setSize (300, 300);

graphcanvas = new GraphCanvas(this);
options = new Options(this);
documentation = new Documentation(this);
routeTable = new RouteTable();

setLayout(new BorderLayout(10, 10));
add("Center", graphcanvas);
add("North", documentation);
add("East", options);
add("South", routeTable);
}

/* ...il resto... */

public static void main (String[] args)
{
BellmanFord frame = new BellmanFord ();
frame.setVisible (true);
}
}

PGI-Bis
27-04-2007, 11:10
Prendi la classe BellmanFord e:

1. aggiungi agli import:

import javax.swing.*;

2. cambia

extends Applet

in

extends JFrame

3. nel costruttore aggiungi come ultima riga:

init();

E qui hai fatto. Ora aggiungi al progetto una classe Main, così:

//package se c'è
import javax.swing.*;

public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main().start();
}
});
}

private void start() {
BellmanFord window = new BellmanFord();
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.pack();
window.setVisible(true);

}

E, se non m'è sfuggito qualcosa, dovresti aver trasformato l'applet in applicazione stand-alone.

PGI-Bis
27-04-2007, 11:11
L'ho già detta quella del pulsantone con la scritta "hey, qualcuno ha già risposto...", vero? :D:

andbin
27-04-2007, 11:28
L'ho già detta quella del pulsantone con la scritta "hey, qualcuno ha già risposto...", vero? :D:Sì ma non ti preoccupare .... come diceva il famoso spot: du risposte is megl che uan

Voltron
27-04-2007, 11:33
Grazie a tutti!

Innanzitutto vi linko il sito dove ho prelevato l'applet che simula l'algoritmo di BellmanFord(magari può essere utile anche ad altri studenti):

http://www.laynetworks.com/Simulation%20of%20Bellman%20Algorithm.htm

quì troverete(mi riferisco soprattutto ad andbin che chiedeva informazioni su GraphCanvas, ecc.) gli altri files di cui è composta l'applet che non ho postato poichè molto lunghi.

Comunque ritengo che l'applet usi awt.

Voltron
27-04-2007, 11:34
Ora provo a testare il codice fornito da andbin....

Voltron
27-04-2007, 11:50
Allora, ho compilato ed esguito il seguente codice(quello gentilmente fornito da andbin a cui ho aggiunto i metodi mancanti):


import java.awt.*;

public class BellmanFord extends Frame
{
private GraphCanvas graphcanvas;
private Options options;
private Documentation documentation;
private RouteTable routeTable;

public BellmanFord ()
{
super ("Un titolo");
setSize (300, 300);

graphcanvas = new GraphCanvas(this);
options = new Options(this);
documentation = new Documentation(this);
routeTable = new RouteTable();

setLayout(new BorderLayout(10, 10));
add("Center", graphcanvas);
add("North", documentation);
add("East", options);
add("South", routeTable);
}

public Insets insets()
{
return new Insets(10, 10, 10, 10);
}

public void lock()
{
graphcanvas.lock();
options.lock();
}

public void unlock()
{
graphcanvas.unlock();
options.unlock();
}

public static void main (String[] args)
{
BellmanFord frame = new BellmanFord ();
frame.setVisible (true);
}
}


Il frame parte correttamente e mi consente di creare il mio grafo e di impostare tutte le opzioni; il problema è che tale frame è composto da 4 pulsanti('clear', 'run', 'step', 'reset') che non funzionano......sto cercando di capire in quale classe vengono creati e perchè non "fungano"!

Voltron
27-04-2007, 12:07
Ho risolto il problema del mancato funzionamento dei pulsanti precedentemente menzionati rendendo 'pubblici' e non 'privati' i campi istanza della classe BellmanFord. Ora l'unico problema è riuscire a visualizzare correttamente la textarea che mostra ad ogni iterazione dell'algoritmo dei messaggi utili all'utente.

ecco uno screenshot che mostra il problema di visualizzazione: http://img143.imageshack.us/my.php?image=algomq4.jpg

Voltron
27-04-2007, 17:02
Qualche "anima pia":) .....è in grado di dirmi cosa modificare(penso nelle impostazioni del border-layout) al fine di evitare che il pannello 'Documentation' collocato a 'North' del frame non venga coperto dalla barra del frame??

screenshot esemplificativo del problema: http://img143.imageshack.us/my.php?image=algomq4.jpg

questo è il listato della classe frame:

import java.awt.*;

public class BellmanFord extends Frame
{
GraphCanvas graphcanvas;
Options options;
Documentation documentation;
RouteTable routeTable;

public BellmanFord ()
{
super ("BellmanFord");
setSize (300, 300);

graphcanvas = new GraphCanvas(this);
options = new Options(this);
documentation = new Documentation(this);
routeTable = new RouteTable();

setLayout(new BorderLayout(10, 10));
add("Center", graphcanvas);
add("North", documentation);
add("East", options);
add("South", routeTable);
pack();
}

public Insets insets()
{
return new Insets(10, 10, 10, 10);
}

public void lock()
{
graphcanvas.lock();
options.lock();
}

public void unlock()
{
graphcanvas.unlock();
options.unlock();
}

public static void main (String[] args)
{
BellmanFord frame = new BellmanFord ();
frame.setVisible (true);
}
}


qualora dovesse servire, ecco la classe 'Documentation' che genera il pannello collogato a 'north' del frame principale e che và a finire sotto alla barra perimetrale del frame stesso:


import java.awt.*;

class Documentation extends Panel
{

Documentation(BellmanFord bellmanford)
{
doctext = new DocText();
grandparent = bellmanford;
docopt = new DocOptions(this, grandparent);
setLayout(new BorderLayout(10, 10));
add("West", docopt);
add("Center", doctext);

}

BellmanFord grandparent;
DocOptions docopt;
DocText doctext;
}


Un grazie anticiato a chiunque avrà la cortesia di aiutarmi ancora.

PGI-Bis
27-04-2007, 17:39
1. Prova a togliere il metodo insets() da BellmanFord
2. Non usare AWT :D.

Voltron
27-04-2007, 21:12
1. Prova a togliere il metodo insets() da BellmanFord
2. Non usare AWT :D.

Ti ringrazio! Ora è sparito il difetto.

ps: in merito al discorso awt.....bè, quello è stato usato da chi ha creato l'applet originaria.:D