1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.IOException;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Demo2 {
private static final String FRAME_TITLE = "Lanceur PacMan";
private static final String START_LABEL = "Démarrer";
private static final String STOP_LABEL = "Arrêter";
private static Process process;
public static void main(String[] args) {
JFrame frame = new JFrame(FRAME_TITLE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// ça c'est pour arrêter le pacman si on ferme la fenêtre du lanceur
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
if ( process!=null ) {
process.destroy();
}
}
}));
// la fenêtre affiche juste deux boutons, un pour démarre, un pour arrêter
JPanel panel = new JPanel(new GridBagLayout());
frame.add(panel);
// on utilise un toggle button pour lancer le jeu ou l'arrêter
JButton startButton = new JButton(START_LABEL);
JButton stopButton = new JButton(STOP_LABEL);
stopButton.setEnabled(false);
startButton.addActionListener(e-> togglePacman(startButton, stopButton));
stopButton.addActionListener(e-> togglePacman(startButton, stopButton));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy=0;
gbc.gridx=GridBagConstraints.RELATIVE;
gbc.insets = new Insets(0, 0, 0, 10);
panel.add(startButton,gbc);
panel.add(stopButton,gbc);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 0));
// on affiche la fenêtre du lanceur
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static void togglePacman(JButton startButton, JButton stopButton) {
if ( !startButton.isEnabled() ) {
// si le bouton start est désactivé, alors on arrête le jeu
process.destroy(); // on kill le process
process=null;
startButton.setEnabled(true);// on réactive le bouton pour redémarrer
stopButton.setEnabled(false);
}
else {
// on lance le programme de jeu dans une autre jvm
ProcessBuilder processBuilder = new ProcessBuilder(Arrays.asList("java.exe","-jar","JavaPacman.jar")).inheritIO();
try {
process = processBuilder.start();
// on lance un thread qui va attendre que le programme se termine pour remettre le bouton correctement
new Thread(new WaitForPacman(process,startButton, stopButton)).start();
startButton.setEnabled(false);
stopButton.setEnabled(true);; // on active le bouton pour arrête le jeu
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "Le jeu n'a pas démarré. Voir la console pour l'erreur.");
}
}
}
private static class WaitForPacman implements Runnable {
private Process process;
private JButton startButton;
private JButton stopButton;
public WaitForPacman(Process process, JButton startButton, JButton stopButton) {
this.process=process;
this.startButton=startButton;
this.stopButton=stopButton;
}
@Override
public void run() {
try {
process.waitFor(); // on attend que le jeu de pacman se termine
} catch (InterruptedException e) {
}
// on remet le bouton pour redémarrer le jeu
startButton.setEnabled(true);
stopButton.setEnabled(false);
process=null;
}
}
} |