Faisons une application de communication dans LAN Partie 4 Définir les informations dans le contrôle JavaFX / Appeler l'écran JavaFX à partir du thread

J'ai fait une sieste (5 heures), alors reprenons le travail.

L'application de communication LAN est terminée aujourd'hui, donc c'est rapide (que cela puisse être fait ou non)

Nous commencerons par réparer le processus de réception.

Réparation du traitement de réception

Créez une fenêtre d'affichage pour les messages entrants.

Tout d'abord, ceci. Créez un écran pour afficher le message reçu à l'aide de JavaFX.

Voici celle réalisée en détournant la fenêtre d'envoi.

2018y06m15d_224036934.jpg

Appelez la fenêtre dès réception.

Je suis resté coincé ici.

Dans cette application, je l'ai créée avec l'image que "lorsqu'un message est reçu, le message reçu est affiché dans une nouvelle fenêtre" Il est conçu pour "préparer un thread d'écoute pour la réception et surveiller le port".

Au début, je me demandais si je devais créer un écran avec le fil de veille pour la réception et l'afficher. Si vous créez une instance de javafx.stage.Stage et appelez la méthode show (), vous obtiendrez une IlegalStateException.

↓ comme ça

RxThread.java


    (Traitement de la réception)

	Stage stage = new Stage();
	stage.show();

↓ Cliquez ici pour les résultats

2018y06m16d_001717192.jpg

Quelle est cette exception? Quand j'ai cherché, je suis tombé sur ce fait. Dit "Si vous essayez de faire fonctionner un élément JavaFX à partir d'un autre thread d'application JavaFX, l'exception ci-dessus sera levée."

Ainsi, lorsque j'ai étudié la solution de contournement, il s'est avéré qu'il y avait une classe appelée javaFX.platform.

Plateforme de cours de documentation Oracle-JavaFX (Japonais)

En enregistrant un thread exécutable dans la méthode runLater () de cette classe, l'application JavaFX semble l'exécuter à la place.

Oh, vous ne pouvez pas faire de nouveau et show ()! Comme formulaire. Le processus d'affichage de la scène en fonction du contenu qui a été étudié immédiatement Réécrivez et vérifiez le fonctionnement.

↓ Changer pour quelque chose comme ça

RxThread.java


    (Traitement de la réception)

	Platform.runLater( () -> {
		Stage stage = new Stage();
		stage.show();
	});

↓ Voici le résultat (Scène avec une nouvelle fenêtre blanche. Redimensionnée mais assez grande au début) 2018y06m16d_004712408.jpg

… Eh bien, en réponse à ce fait Il était nécessaire de changer la composition du dessin d'écran. (Soupir) C'est trop sale si c'est fait maintenant ...

Je l'ai réparé (en l'utilisant pendant une heure).

À peu près modifié pour faire quelque chose comme ça

Traitement lié à l'étape
Fichier FXML pour chaque écran
Classe d'acquisition de scène pour chaque écran
Classe de contrôleur pour chaque écran
Traitement d'envoi / réception
Classe d'héritage de thread qui envoie des données à l'aide de la communication socket Classe d’héritage des threads qui surveille le port de réception et reçoit des données
Traitement normal Classe d'héritage de thread à usage général pour obliger Platform.runLator () à effectuer le traitement de dessin d'étape Classe contenant des points d'entrée

En apportant les modifications ci-dessus, [Confirmer la réception du message] => [Étape de réception du message] => [Demander une tâche de dessin au fil d'application] => [Étape de dessin] Il est désormais possible de traiter.

2018y06m16d_035944134.jpg

Ensuite, je voudrais afficher le message reçu sur cette étape.

Définir une valeur dans le contrôleur GUI affiché à l'aide de JavaFx

C'était aussi bien emballé ici. Et avec une référence nulle.

Temps ... Temps ... (frustré)

La méthode de réglage peut être réalisée par la procédure suivante.

  1. Préparez un processus pour faire fonctionner le contrôle dans la classe de contrôleur liée à l'interface graphique.
  2. Obtenez une instance du contrôleur et appelez la méthode d'opération préparée

Comme c'est facile une fois que vous l'écrivez

Préparez un processus pour faire fonctionner le contrôle dans la classe de contrôleur liée à l'interface graphique.

C'est facile. Ce n'est pas grave si vous créez un setter ordinaire. Pour traiter le contrôle comme un objet, voir "Créons une application de communication intra-LAN Partie 3" (https://qiita.com/Shiratori/items/35b0c488f6adbb034cd4) "Un objet avec le même type et le même nom que le contrôle avec l'ID défini. Voir l'élément «Déclarer en classe».

Obtenez une instance du contrôleur et appelez la méthode d'opération préparée

cette. Je suis complètement accro à ça. Les points sont les suivants.

  • L'instance de contrôleur utilise la méthode getController () de la classe FXMLLoader. (Puisqu'il est retourné en tant que type Object, transtypez-le dans la classe spécifiée dans le contrôleur)
  • L'instance ci-dessus est créée lorsque la méthode FXMLLoader.load () est exécutée. (Si vous essayez de le toucher avant cela, vous vous fâcherez avec une référence nulle.

Donc, pour ce processus, créez un getter qui renvoie la valeur de getControl () avec un contrôleur qui a l'état réel de fxmlLoader. Créez un wrapper qui le reçoit dans le fil de dessin de la scène et le renvoie tel quel ... et à l'infini ...

Cela en valait la peine et cela a réussi jusqu'à ce que le message récupéré soit affiché.

2018y06m16d_043800899.jpg

Permet de recevoir des messages de manière stable.

Voici une très triste nouvelle. Eh bien, hier j'étais un peu abasourdi (excuse) J'ai mis un traitement inutile et j'ai attendu un message.

Donc, omettez les traitements inutiles et corrigez-le comme ceci

RxThread.java


			while (length >= 0) {
				byte[] buffer = new byte[1024];
				length = dis.read(buffer);
				sBuffer.append(new String(buffer));
				
			}

  1. Prenez la zone tampon
  2. Mettez à jour la quantité de données acquises
  3. Les données acquises sont stockées dans le tampon de chaînes de caractères.

Voilà le processus. Je me demande si la taille du tampon pourrait être la valeur de la longueur.

Dans le cas d'une communication par socket, -1 sera renvoyé lorsqu'il n'y a pas d'informations à acquérir. Si vous manquez d'informations à prendre, elles sortiront.

Il n'y a pas de problème pour l'instant, alors laissez cela tranquille. En fait, je dis à l'autre partie la quantité de données à transmettre en premier (pour se préparer à la perte lors de la transmission). Eh bien, cette fois, c'est dans le LAN. Pas de cryptage.

Essayez de communiquer entre les terminaux.

Eh bien, je l'ai mis en œuvre partout pour le moment (haz), alors communiquons entre les terminaux du LAN.

Pour le moment, le résultat sur la machine de développement (Windows 7) et l'ordinateur portable commercial (Windows 10) ressemble à ceci

(C'est une photo très lourde car elle a été prise avec un appareil photo mobile. Elle est plus de 70 fois plus grande que l'unité principale développée (bibliothèque incluse)) P_20180616_060205_vHDR_On.jpg

Alors, hélas, je me suis mis en colère quand j'ai essayé de démarrer sous Linux. Quand je l'ai regardé légèrement, j'ai trouvé qu'il y avait un soleil. * Bibliothèque système, donc je me demande s'il faut faire un peu plus de recherche. Screenshot from 2018-06-16 06-32-05.png

Comme il a été construit en Java, je souhaite prendre en charge différents systèmes d'exploitation. Avez-vous atteint votre objectif pour le moment? Jusqu'ici cette fois. C'est un peu difficile à utiliser car vous touchez directement l'IP. Il y a un point d'amélioration ... C'est une fonction différente (réouverture) Je crains que / ou quelque chose soit inclus dans l'adresse acquise.

Postscript: Il semble que la bibliothèque JavaFX n'était pas incluse ... ça? Le 1.8 n'était-il plus la norme ...? Après avoir installé openjfx, il a démarré normalement.

Screenshot from 2018-06-16 07-58-48.png

Le résultat de la communication ressemble à ceci. (Affiché dans VNC.)

2018y06m16d_080211838.jpg


L'opération du dernier jour se termine à 07:41:54. Globalement 23:03:51.

Que va-t-il se passer la semaine prochaine?

Oh, j'ai oublié de le mentionner, mais voici GitHub

GitHub - PrivateMessenger https://github.com/Shiratori1218/PrivateMessenger

Recommended Posts