teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

2番目の問題について追記しました。

2015/12/31 03:07

投稿

argius
argius

スコア9396

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
+ ループで処理するとしたら、サーバーとはデータをキャッチボールのようにやりとりしないといけないので、ソケットの入力と出力を別々のタスクにせず、できれば、メッセージを送ったらサーバーの応答を待つようなロジックにしたほうが良いと思います。