Il s'agit du processus lorsque vous souhaitez configurer l'interface graphique séparément du processus principal.
Par exemple, si vous écriviez un système de traitement de la langue
Lorsque le système de traitement reçoit l'instruction de créer une trame à partir du script de traitement
Le système de traitement doit mettre en place un cadre.
Ceci est une histoire que vous n'avez qu'à exécuter JFrame frame = new JFrame ();
,
L'histoire est différente lorsque vous êtes invité à mettre un bouton sur le cadre ou à le dessiner.
Supposons que vous ajoutiez la classe Canvas à frame. Il remplace la méthode de peinture de toile, mais la méthode de peinture n'est pas appelée par le codeur, mais par le côté du cadre si nécessaire.
C'est un peu délicat. En fait, le système de traitement veut donner une commande de représentation au cadre, mais le cadre émet une commande de représentation au canevas. Dans ce flux, canvas appellera le système de traitement.
Pour le moment, je n'ai parlé que du traitement du langage, mais cela peut également s'appliquer si vous souhaitez utiliser l'interface graphique à partir de la CUI.
Remplacez l'exécution dans une classe qui hérite de Thread. L'interface graphique est générée dans cette exécution. Et dans l'ensemble, je n'ai pas touché aux classes GUI Démarrez et utilisez une classe qui hérite de ce Thread.
Classe LinkedBlockingQueue Lors de la prise, cette classe peut faire attendre le thread jusqu'à ce que l'élément arrive, et peut facilement effectuer un contrôle exclusif. L'interface graphique gère le processus en examinant cette file d'attente.
Le programme suivant trace les coordonnées de la ligne dans l'ordre où elles sont arrivées après avoir attendu dans la file d'attente.
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
import javax.swing.JFrame;
public class Test {
public static LinkedBlockingQueue<int[]> drawQueue = null;
static {
drawQueue = new LinkedBlockingQueue<int[]>();
}
public static void main(String[] args) {
Thread canvasThread = new CanvasThread();
canvasThread.start();
Random rand = new Random(System.currentTimeMillis());
for (int i = 0; i < 120; i++) {
drawQueue.add(new int[] { rand.nextInt(CanvasThread.WIDTH),
rand.nextInt(CanvasThread.HEIGHT),
rand.nextInt(CanvasThread.WIDTH),
rand.nextInt(CanvasThread.HEIGHT) });
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
drawQueue.add(new int[]{});
}
}
class CanvasThread extends Thread {
public static final int HEIGHT = 400;
public static final int WIDTH = 600;
@Override
public void run() {
JFrame frame = new JFrame("test");
frame.setSize(WIDTH, HEIGHT);
frame.setVisible(true);
frame.add(new Canvas() {
@Override
public void paint(Graphics g) {
System.out.println("print start");
int[] x = null;
Random rand = new Random(System.currentTimeMillis());
try {
while ((x = Test2.drawQueue.take()).length == 4) {
g.setColor(new Color(rand.nextInt(256), rand
.nextInt(256), rand.nextInt(256)));
g.drawLine(x[0], x[1], x[2], x[3]);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("paint end");
}
});
}
}
Recommended Posts