回答編集履歴
1
2番目の問題について追記しました。
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
1番目の問題について。
|
2
|
+
|
1
3
|
`NetSendMessageTask`クラスの「データの送信」コメントの次の行で、`getMessage`メソッドを使用していますが、このメソッドはJavaFXアプリケーションスレッドからしかアクセスできない仕組みになっています。
|
2
4
|
試しに、`getMessage`メソッドの行をtry-catchで囲んでみてください。
|
3
5
|
`Task must only be used from the FX Application Thread`という例外メッセージが表示されるはずです。
|
@@ -13,4 +15,22 @@
|
|
13
15
|
...
|
14
16
|
|
15
17
|
さて、テキストフィールドの値を`Task`に渡すには、どのような方法が適切かがちょっと分からないのですが、
|
16
|
-
`NetSendMessageTask`クラスにテキストフィールドの`StringProperty`を渡してしまって、そこからメッセージを取得すれば一応動作します。
|
18
|
+
`NetSendMessageTask`クラスにテキストフィールドの`StringProperty`を渡してしまって、そこからメッセージを取得すれば一応動作します。
|
19
|
+
|
20
|
+
---
|
21
|
+
|
22
|
+
(追記)
|
23
|
+
|
24
|
+
2番目の問題について。
|
25
|
+
|
26
|
+
意図しない処理になるかもしれませんが、とりあえずは以下をやってみてください。
|
27
|
+
|
28
|
+
- `NetSendMessageTask`の`call`メソッドの`while`を`if`に変更(応答を待っていないので無限ループになる)
|
29
|
+
- `NetSendMessageTask`の`call`メソッドの`updateMessage("");`を`messageProp.set("");`に変更(`messageProp`はテキストフィールドの`StringProperty`)
|
30
|
+
- `handleButtonSendMessageAction`の`sendMessage.textProperty().bind(taskSendMessage.messageProperty());`を削除(使っていないので)
|
31
|
+
|
32
|
+
なぜタスクとテキストフィールドのバインドが上手く行かないのかは、勉強不足のため分かりませんでした。
|
33
|
+
|
34
|
+
...
|
35
|
+
|
36
|
+
ループで処理するとしたら、サーバーとはデータをキャッチボールのようにやりとりしないといけないので、ソケットの入力と出力を別々のタスクにせず、できれば、メッセージを送ったらサーバーの応答を待つようなロジックにしたほうが良いと思います。
|