Richten Sie eine Java-GUI in einem separaten Thread ein, um die Haupt-GUI beizubehalten

Ich möchte die GUI für die Unterverarbeitung verwenden

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.

Richten Sie die GUI in einem vom Hauptthread getrennten Thread ein

Ü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.

Verwenden Sie die verknüpfte Blockierungswarteschlange, um Daten auszutauschen

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.

Stichprobe

Das folgende Programm zeichnet die Linienkoordinaten in der Reihenfolge, in der sie nach dem Warten in der Warteschlange angekommen sind.

WS000044.JPG

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

Richten Sie eine Java-GUI in einem separaten Thread ein, um die Haupt-GUI beizubehalten
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
[Android / Java] Richten Sie eine Schaltfläche ein, um zu Fragment zurückzukehren
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
So richten Sie einen Proxy mit Authentifizierung in Feign ein
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Java-Referenz zum Verständnis in der Abbildung
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
Was ist die Hauptmethode in Java?
So erhalten Sie das Datum mit Java
[Java Bronze] 5 Probleme zu beachten
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Memorandum zum Bereinigen des Codes Ruby
So zeigen Sie eine Webseite in Java an
Messen Sie die Größe eines Ordners mit Java
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Festlegen des HTTP-Keep-Alive-Timeouts im Java-HTTP-Client
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Legen Sie die Quelle der Bibliothek als Abhängigkeit in IntelliJ als separates Modul des Projekts fest
[Java] Dateien in src / main / resources lesen
Richten Sie einen Webhook in der benutzerdefinierten App von Shopify ein
Übergeben Sie die im Java8-Lambda-Ausdruck filter () verwendeten Bedingungen als Parameter
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
Quelle zum Abrufen der Umleitungsquell-URL in Java
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
So erstellen Sie einen Daten-URI (base64) in Java
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
In der Abbildung verstandene Java-Klassen und -Instanzen
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Eine kurze Erklärung der fünf Arten von Java Static
Erstellen wir eine Taschenrechner-App mit Java ~ Zeigen Sie das Anwendungsfenster an
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
Konvertieren Sie ein Java-Byte-Array in eine hexadezimale Zeichenfolge
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
[Android, Java] Praktische Methode zur Berechnung der Differenz in Tagen
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
Richten Sie in IntelliJ ein Gradle-Multiprojekt ein, um eine JAR-Datei zu erstellen
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
So entwickeln und registrieren Sie eine Sota-App in Java
So simulieren Sie das Hochladen von Post-Object-Formularen in OSS in Java
So leiten Sie den letzten Tag des Monats in Java ab