Configurez une interface graphique Java dans un thread séparé pour conserver le

Je souhaite utiliser l'interface graphique pour le sous-traitement

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.

Configurer l'interface graphique dans un thread distinct du thread principal

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.

Utiliser la file d'attente de blocage liée pour échanger des données

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.

échantillon

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.

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

Configurez une interface graphique Java dans un thread séparé pour conserver le
Deux façons de démarrer un thread en Java + @
[Android / Java] Configurer un bouton pour revenir à Fragment
Créer une méthode pour renvoyer le taux de taxe en Java
Comment configurer un proxy avec authentification dans Feign
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Référence Java à comprendre dans la figure
[Java] Comment régler la date sur 00:00:00
Quelle est la méthode principale en Java?
Comment obtenir la date avec Java
[Java Bronze] 5 problèmes à garder à l'esprit
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Mémorandum pour nettoyer le code Ruby
Comment afficher une page Web en Java
Mesurer la taille d'un dossier avec Java
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
Définir l'heure de LocalDateTime à une heure spécifique
Définir le délai d'attente HTTP Keep Alive dans le client HTTP Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Définir la source de l'ensemble de bibliothèques en tant que dépendance dans IntelliJ en tant que module distinct du projet
[Java] Lire les fichiers dans src / main / resources
Configurer un webhook dans l'application personnalisée de Shopify
Passer les conditions utilisées dans le filtre d'expression lambda Java8 () comme paramètres
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment créer un environnement Java en seulement 3 secondes
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
[Java] Comment omettre le constructeur privé dans Lombok
Source utilisée pour obtenir l'URL de la source de redirection en Java
J'ai essayé de créer une compétence Clova en Java
Comment créer un URI de données (base64) en Java
Remarque sur l'initialisation des champs dans le didacticiel Java
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
J'ai essayé de créer une fonction de connexion avec Java
Classes et instances Java comprises dans la figure
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
Essayez de résoudre un problème FizzBuzz restreint en Java
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Une explication rapide des cinq types de statique Java
Faisons une application de calcul avec Java ~ Afficher la fenêtre de l'application
Comment régler chrony lorsque le temps change dans CentOS7
Convertir un tableau d'octets Java en une chaîne hexadécimale
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
[Android, Java] Méthode pratique pour calculer la différence en jours
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Je voulais juste créer une propriété réactive en Java
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Configurer un multi-projet Gradle dans IntelliJ pour créer un fichier JAR
Comment ajouter les mêmes index dans un tableau imbriqué
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Comment développer et enregistrer une application Sota en Java
Comment simuler le téléchargement de formulaires post-objet vers OSS en Java
Comment dériver le dernier jour du mois en Java