Dies ist der Prozess, wenn Sie die GUI getrennt vom Hauptprozess einrichten möchten.
Zum Beispiel, wenn Sie ein Sprachverarbeitungssystem schreiben
Wenn das Verarbeitungssystem angewiesen wird, einen Frame aus dem Verarbeitungsskript zu erstellen
Das Verarbeitungssystem muss einen Rahmen einrichten.
Dies ist eine Geschichte, die Sie nur ausführen müssen JFrame frame = new JFrame ();
,
Die Geschichte ist anders, wenn Sie angewiesen werden, einen Knopf auf den Rahmen zu legen oder ihn zu zeichnen.
Angenommen, Sie fügen dem Rahmen die Canvas-Klasse hinzu. Es überschreibt die Canvas-Malmethode, aber die Malmethode wird nicht vom Codierer, sondern bei Bedarf von der Rahmenseite aufgerufen.
Das ist etwas knifflig. Eigentlich möchte das Verarbeitungssystem dem Frame einen Darstellungsbefehl geben, aber der Frame gibt einen Darstellungsbefehl an die Zeichenfläche aus. In diesem Ablauf ruft Canvas das Verarbeitungssystem auf.
Im Moment habe ich nur über die Sprachverarbeitung gesprochen, aber es kann auch zutreffen, wenn Sie die GUI über die CUI bedienen möchten.
Überschreiben Sie die Ausführung in einer Klasse, die Thread erbt. In diesem Lauf wird eine GUI generiert. Und hauptsächlich habe ich die GUI-Klassen nicht berührt Starten Sie eine Klasse, die diesen Thread erbt, und verwenden Sie sie.
Klasse LinkedBlockingQueue Diese Klasse kann den Thread warten lassen, bis das Element kommt, und kann problemlos eine exklusive Steuerung durchführen. Die GUI behandelt den Prozess anhand dieser Warteschlange.
Das folgende Programm zeichnet die Linienkoordinaten in der Reihenfolge, in der sie nach dem Warten in der Warteschlange angekommen sind.
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