javafx 和netty 混合使用出现线程不一致问题,求大神指点
package com.todd.nio.client.ui.controller;
import io.netty.channel.ChannelHandlerContext;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import com.todd.nio.client.NioClient;
import com.todd.nio.client.NioClientHandler;
import com.todd.nio.utils.message.MessageContext;
import com.todd.nio.utils.state.SimpleClientState;
/**
* 登陆界面控制器
*
* @Filename LoginController.java
* @Description
* @Version 1.0
* @Author Todd
* @Email lidetao0@163.com
*
* @History
*<li>Author: Todd</li>
*<li>Date: 2015年1月28日</li>
*
*/
public class LoginController {
@FXML
private Label loginMsg;
@FXML
private AnchorPane paneMain;
@FXML
private TextField account;
@FXML
private PasswordField password;
@FXML
private Button submit;
@FXML
public void onSubmitClicked(ActionEvent event) throws Exception {
loginMsg.setText("start");
submit.setDisable(true);
if (SimpleClientState.isLogin()) {
loginMsg.setText("已经登陆,请不要重复登陆.");
}
try {
NioClient.login(account.getText(), password.getText(), new NioClientHandler() {
@Override
public void channelReadLast(ChannelHandlerContext ctx, MessageContext msg)
throws Exception {
System.out.println(msg.toString());
if (SimpleClientState.isSuccess(msg)) {
SimpleClientState.logined(msg.getKey());
loginMsg.setText("登陆成功");
submit.setDisable(false);
} else {
loginMsg.setText("登陆失败, 失败原因....");
NioClient.close();
submit.setDisable(false);
}
}
});
} catch (Exception e) {
loginMsg.setText("连接服务器失败,请联系系统管理员.");
//e.printStackTrace();
}
}
@FXML
public void onResetClicked(ActionEvent event) {
loginMsg.setText("登陆失败, 失败原因....");
account.setText("");
password.setText("");
System.out.println("clear button clicked");
}
public Label getLoginMsg() {
return loginMsg;
}
//.......省略部分代码
}
这个是FXML的控制类
当我在handdel中调用loginMsg.setText() --代码中红色标注部分 就会报错,请问我改怎么修改?
详细错误如下:
Exception in thread "nioEventLoopGroup-2-1" java.lang.IllegalStateException: Not on FX application thread; currentThread = nioEventLoopGroup-2-1
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:364)
at javafx.scene.Parent$2.onProposedChange(Parent.java:364)
at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)
at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204)
at com.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda$registerChangeListener$60(BehaviorSkinBase.java:197)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$$Lambda$92/14449400.call(Unknown Source)
at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(MultiplePropertyChangeListenerHandler.java:55)
at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:143)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
at javafx.beans.property.StringProperty.setValue(StringProperty.java:65)
at javafx.scene.control.Labeled.setText(Labeled.java:146)
at com.todd.nio.client.ui.controller.LoginController$1.channelReadLast(LoginController.java:61)
at com.todd.nio.client.NioClientHandler.channelRead0(NioClientHandler.java:35)
at com.todd.nio.client.NioClientHandler.channelRead0(NioClientHandler.java:1)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)