回答編集履歴

1

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

2015/12/31 03:07

投稿

argius
argius

スコア9388

test CHANGED
@@ -1,3 +1,7 @@
1
+ 1番目の問題について。
2
+
3
+
4
+
1
5
  `NetSendMessageTask`クラスの「データの送信」コメントの次の行で、`getMessage`メソッドを使用していますが、このメソッドはJavaFXアプリケーションスレッドからしかアクセスできない仕組みになっています。
2
6
 
3
7
  試しに、`getMessage`メソッドの行をtry-catchで囲んでみてください。
@@ -29,3 +33,41 @@
29
33
  さて、テキストフィールドの値を`Task`に渡すには、どのような方法が適切かがちょっと分からないのですが、
30
34
 
31
35
  `NetSendMessageTask`クラスにテキストフィールドの`StringProperty`を渡してしまって、そこからメッセージを取得すれば一応動作します。
36
+
37
+
38
+
39
+ ---
40
+
41
+
42
+
43
+ (追記)
44
+
45
+
46
+
47
+ 2番目の問題について。
48
+
49
+
50
+
51
+ 意図しない処理になるかもしれませんが、とりあえずは以下をやってみてください。
52
+
53
+
54
+
55
+ - `NetSendMessageTask`の`call`メソッドの`while`を`if`に変更(応答を待っていないので無限ループになる)
56
+
57
+ - `NetSendMessageTask`の`call`メソッドの`updateMessage("");`を`messageProp.set("");`に変更(`messageProp`はテキストフィールドの`StringProperty`)
58
+
59
+ - `handleButtonSendMessageAction`の`sendMessage.textProperty().bind(taskSendMessage.messageProperty());`を削除(使っていないので)
60
+
61
+
62
+
63
+ なぜタスクとテキストフィールドのバインドが上手く行かないのかは、勉強不足のため分かりませんでした。
64
+
65
+
66
+
67
+ ...
68
+
69
+
70
+
71
+ ループで処理するとしたら、サーバーとはデータをキャッチボールのようにやりとりしないといけないので、ソケットの入力と出力を別々のタスクにせず、できれば、メッセージを送ったらサーバーの応答を待つようなロジックにしたほうが良いと思います。
72
+
73
+