Applet executable

Il peut être intéressant d'avoir une applet Java qui puisse aussi s'exécuter de façon autonome.
Le livre "Introduction à Java" à ce sujet n'est pas très clair... et son exemple ne semble pas marcher
(mettre à la fois les méthode main(), run(), stop() et init() dans la même classe).
Le plus propre est comme toujours de ne pas surcharger le code, et de bien séparer les fonctions :
- Une classe pour l'applet : ProgApp
- Une classe pour la fonction autonome : Prog
Le tout dans le même fichier jar. C'est là l'astuce.
Si on appelle l'applet, la classe de démarrage est dans la balise applet : code=ProgApp.class
Si on exécute directement le fichier jar, la classe de démarrage est définie dans le manifeste : Main-Class: Prog

La classe Prog contient un constructeur, une méthode main() (bien sûr !) et deux méthodes de démarrage et d'arrêt personalisées.

La classe ProgApp, dans sa méthode init(), instancie ... un objet Prog ! et le met dans son panneau de contenu.
Les méthodes start() et stop() de l'applet appellent simplement les méthodes start et stop de Prog.

import javax.swing.JApplet;

public class ProgApp extends JApplet {

private Prog myprog;

public void init() {

getContentPane().add("Center", myprog = new Prog());
}

public void start() {

myprog.start();
}

public void stop() {

myprog.stop();
}
}
 

Il n'y a finalement pas grand chose dans cette classe ! C'est juste un stub pour exécuter Prog en tant qu'applet.

Tout le travail est (et doit être) fait dans Prog et les autres classes qu'il instancie.

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

public class Prog extends JPanel {

JButton startB; // start/stop button

// Constructeur : définit l'interface graphique
public Prog() {

setLayout(new BorderLayout(5,0));

JPanel p1 = new JPanel();
startB = new JButton("Start");
startB.addActionListener(this);
p1.add(startB);
// ...
add("North", p1);

} // constructeur

// Méthode de démarrage
public void start() {

try {
sequencer = MidiSystem.getSequencer();
sequencer.open();
} catch (Exception e) { e.printStackTrace(); }
sequencer.addMetaEventListener(this);
}

// Méthode d'arrêt
public void stop() {

if (startB.getText().startsWith("Stop")) {
startB.doClick(0);
}
if (sequencer != null) {
sequencer.close();
}
sequencer = null;
}

// Initialisation en tant qu'application
public static void main(String args[]) {

final Prog myprog = new Prog();
JFrame f = new JFrame("Prog");
f.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {System.exit(0);}
  });
f.getContentPane().add("Center", myprog);
f.pack();
f.setSize(320, 140);
f.show();
prog.open();
}

}
 

Cet exemple ne fait pas grand chose, mais à vous de jouer...

 

Sommaire informatique Accueil Mail