Lassen Sie uns eine Kommunikationsanwendung in LAN Teil 4 erstellen. Informationen in JavaFX-Steuerung festlegen / JavaFX-Bildschirm vom Thread aufrufen

Ich habe ein Nickerchen gemacht (5 Stunden), also lass uns wieder arbeiten.

Die LAN-Kommunikations-App ist heute vorbei, also ist es schnell (ob es möglich ist oder nicht)

Wir beginnen mit der Reparatur des Empfangsprozesses.

Reparatur der Empfangsabwicklung

Erstellen Sie ein Anzeigefenster für eingehende Nachrichten.

Zuallererst dies. Erstellen Sie einen Bildschirm, um die empfangene Nachricht mit JavaFX anzuzeigen.

Hier ist die, die durch Umleiten des Sendefensters erstellt wurde.

2018y06m15d_224036934.jpg

Rufen Sie das Fenster nach Erhalt an.

Ich bin hier festgefahren.

In dieser Anwendung habe ich es mit dem Bild erstellt, dass "wenn eine Nachricht empfangen wird, die empfangene Nachricht in einem neuen Fenster angezeigt wird". Es wurde entwickelt, um "einen Abhör-Thread für den Empfang vorzubereiten und den Port zu überwachen".

Zuerst habe ich mich gefragt, ob ich einen Bildschirm mit dem Standby-Thread für den Empfang erstellen und anzeigen soll. Wenn Sie eine Instanz von javafx.stage.Stage erstellen und die show () -Methode aufrufen, erhalten Sie eine IlegalStateException.

↓ So.

RxThread.java


    (Empfangsverarbeitung)

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

↓ Klicken Sie hier für Ergebnisse

2018y06m16d_001717192.jpg

Was ist diese Ausnahme? Als ich es nachgeschlagen habe, bin ich auf diese Tatsache gestoßen. Sagt "Wenn Sie versuchen, ein JavaFX-Element von einem anderen als dem JavaFX-Anwendungsthread aus zu betreiben, wird die obige Ausnahme ausgelöst."

Als ich die Problemumgehung untersuchte, stellte sich heraus, dass es eine Klasse namens javaFX.platform gab.

Oracle-JavaFX Documentation Class-Plattform (Japanisch)

Durch die Registrierung eines ausführbaren Threads in der runLater () -Methode dieser Klasse scheint die JavaFX-Anwendung ihn stattdessen auszuführen.

Oh, du kannst nichts Neues machen und zeigen ()! Wie Form. Der Prozess der Anzeige der Bühne basierend auf dem Inhalt, der sofort untersucht wurde Schreiben Sie den Vorgang neu und überprüfen Sie ihn.

↓ Wechseln Sie zu so etwas

RxThread.java


    (Empfangsverarbeitung)

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

↓ Hier ist das Ergebnis (Bühne mit einem neuen weißen Fenster. Größe geändert, aber zunächst ziemlich groß) 2018y06m16d_004712408.jpg

… Nun, als Antwort auf diese Tatsache Die Zusammensetzung der Bildschirmzeichnung musste geändert werden. (Seufzer) Es ist zu schmutzig, wenn es jetzt gemacht wird ...

Ich habe es repariert (eine Stunde lang benutzt).

Grob modifiziert, um so etwas zu machen

Stufenbezogene Verarbeitung
FXML-Datei für jeden Bildschirm
Stufenerfassungsklasse für jeden Bildschirm
Controller-Klasse für jeden Bildschirm
Sende- / Empfangsverarbeitung
Thread-Vererbungsklasse, die Daten über Socket-Kommunikation sendet Thread-Vererbungsklasse, die den empfangenden Port überwacht und Daten empfängt
Normale Verarbeitung Allzweck-Thread-Vererbungsklasse, um Platform.runLator () zu veranlassen, die Verarbeitung von Bühnenzeichnungen durchzuführen Klasse mit Einstiegspunkten

Indem Sie die obigen Änderungen vornehmen, [Nachrichtenempfang bestätigen] => [Empfangene Nachricht abrufen Phase] => [Zeichenaufgabe an Anwendungsthread anfordern] => [Zeichenphase] Es ist jetzt möglich zu verarbeiten.

2018y06m16d_035944134.jpg

Als nächstes möchte ich die empfangene Nachricht auf dieser Bühne anzeigen.

Legen Sie einen Wert im GUI-Controller fest, der mit JavaFx angezeigt wird

Es war auch hier dicht gepackt. Und mit einer Nullreferenz.

Zeit ... Zeit ... (frustriert)

Die Einstellmethode kann durch das folgende Verfahren realisiert werden.

  1. Bereiten Sie einen Prozess zum Bedienen des Steuerelements in der mit der GUI verknüpften Controller-Klasse vor.
  2. Rufen Sie eine Instanz des Controllers ab und rufen Sie die vorbereitete Operationsmethode auf

Wie einfach es aussieht, wenn Sie es schreiben

Bereiten Sie einen Prozess zum Bedienen des Steuerelements in der mit der GUI verknüpften Controller-Klasse vor.

Das ist einfach. Es ist in Ordnung, wenn Sie einen gewöhnlichen Setter machen. Informationen zum Behandeln des Steuerelements als Objekt finden Sie unter "Erstellen einer Intra-LAN-Kommunikations-App Teil 3" (https://qiita.com/Shiratori/items/35b0c488f6adbb034cd4). "Ein Objekt mit demselben Typ und Namen wie das Steuerelement mit festgelegter ID. Siehe den Punkt "In Klasse deklarieren".

Rufen Sie eine Instanz des Controllers ab und rufen Sie die vorbereitete Operationsmethode auf

Dies. Ich bin total begeistert davon. Die Punkte sind wie folgt.

  • Die Controller-Instanz verwendet die Methode getController () der FXMLLoader-Klasse. (Da es als Objekttyp zurückgegeben wird, wandeln Sie es in die im Controller angegebene Klasse um.)
  • Die obige Instanz wird erstellt, wenn die Methode FXMLLoader.load () ausgeführt wird. (Wenn Sie versuchen, es früher zu berühren, werden Sie wütend auf eine Nullreferenz.

Erstellen Sie für diesen Prozess einen Getter, der den Wert von getControl () mit einem Controller zurückgibt, der den tatsächlichen Status von fxmlLoader hat. Erstellen Sie einen Wrapper, der ihn im Stage-Zeichnungsthread empfängt und so zurückgibt, wie er ist ... und endlos ...

Es hat sich gelohnt und war erfolgreich, bis die abgerufene Nachricht angezeigt wurde.

2018y06m16d_043800899.jpg

Ermöglichen Sie den stabilen Empfang von Nachrichten.

Hier ist eine sehr traurige Nachricht. Nun, gestern war ich irgendwie fassungslos (Entschuldigung) Ich habe nutzlos verarbeitet und auf eine Nachricht gewartet.

Lassen Sie also unnötige Verarbeitungen aus und beheben Sie diese

RxThread.java


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

  1. Nehmen Sie den Pufferbereich
  2. Aktualisieren Sie die Menge der erfassten Daten
  3. Die erfassten Daten werden im Zeichenfolgenpuffer gespeichert.

Das ist der Prozess. Ich frage mich, ob die Puffergröße der Wert der Länge sein könnte.

Bei der Socket-Kommunikation wird -1 zurückgegeben, wenn keine Informationen zu erfassen sind. Wenn Ihnen die Informationen ausgehen, werden sie herauskommen.

Bisher gibt es kein Problem, also lassen Sie dies in Ruhe. Eigentlich sage ich der anderen Partei, welche Datenmenge zuerst übertragen werden soll (um den Verlust während der Übertragung vorzubereiten). Nun, diesmal ist es im LAN. Keine Verschlüsselung.

Versuchen Sie, zwischen Terminals zu kommunizieren.

Nun, ich habe es vorerst komplett implementiert (haz), also lasst uns zwischen den Terminals im LAN kommunizieren.

Das Ergebnis auf dem Entwicklungscomputer (Windows 7) und dem kommerziellen Laptop (Windows 10) sieht vorerst so aus

(Es ist ein sehr schweres Foto, da es mit einer mobilen Kamera aufgenommen wurde. Es ist mehr als 70-mal größer als das entwickelte Hauptgerät (einschließlich Bibliothek).) P_20180616_060205_vHDR_On.jpg

Leider wurde ich wütend, als ich versuchte, unter Linux zu booten. Als ich es leicht nachschlug, stellte ich fest, dass es eine Sonne gab. * Systembibliothek, also frage ich mich, ob es etwas mehr Forschung geben muss. Screenshot from 2018-06-16 06-32-05.png

Da es in Java erstellt wurde, möchte ich verschiedene Betriebssysteme unterstützen. Haben Sie Ihr Ziel vorerst erreicht? So weit diesmal. Es ist etwas schwierig zu bedienen, da Sie die IP direkt drücken. Es gibt einen Verbesserungspunkt ... Es ist eine andere Funktion (Wiedereröffnung) Ich mache mir Sorgen, dass / oder etwas in der erworbenen Adresse enthalten ist.

Nachtrag: Es scheint, dass die JavaFX-Bibliothek nicht enthalten war ... das? War 1.8 nicht mehr der Standard ...? Nach der Installation von openjfx wurde es normal gestartet.

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

Das Kommunikationsergebnis sieht so aus. (Wird in VNC angezeigt.)

2018y06m16d_080211838.jpg


Die Operation am letzten Tag endet um 07:41:54. Insgesamt 23:03:51.

Was wird nächste Woche passieren?

Oh, ich habe vergessen es zu erwähnen, aber hier ist GitHub

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

Recommended Posts