時系列のままに書いている間が漂ってきましたが。。。。
最初はボタンイベント(handleButtonAction)からjavafx.concurrent.Serviceをキックしていた。ただGrizzlyの中でWebsocket用のスレッドが立てられているので、「Websoketスレッド起動の処理」をスレッド化しても多分意味がないことに気づいた。少なくとも今問題になっている「Not on FX application thread」というやつの対策にはならなそう。
ボタンイベントから直接Websocket用のスレッド起動を行うように変更。
public class SampleController implements Initializable { @FXML private TableView<RowData> table; @FXML private TableColumn<RowData, String> column; @FXML private void handleButtonAction(ActionEvent event) { try { CountDownLatch messageLatch = new CountDownLatch(1); URI clientURI = new URI("ws://localhost:8080/first/hello/"); ClientManager cliContainer = org.glassfish.tyrus.client.ClientManager .createClient(); cliContainer.connectToServer(new WSClient(table), clientURI); messageLatch.await(1, TimeUnit.SECONDS); } catch (DeploymentException | URISyntaxException | InterruptedException ex) { Logger.getLogger(SampleController.class.getName()).log( Level.SEVERE, null, ex); } } @Override public void initialize(URL url, ResourceBundle rb) { table.setEditable(true); column.setResizable(true); column.setCellValueFactory(new PropertyValueFactory<RowData, String>( "message")); } }
予定通りWebsocket(のスレッド)はキックされている。
@OnMessageでLabelの値に反映させる方法は調査中。 -> 動いた
それを皮切りに”ObservableList経由で反映しているTableView”以外もやっつけるつもりだったけどそもそもできるか不安になってきた。。。