packagecom.todd.nio.client.ui.controller;

importio.netty.channel.ChannelHandlerContext;
importjavafx.event.ActionEvent;
importjavafx.fxml.FXML;
importjavafx.scene.control.Button;
importjavafx.scene.control.Label;
importjavafx.scene.control.PasswordField;
importjavafx.scene.control.TextField;
importjavafx.scene.layout.AnchorPane;

importcom.todd.nio.client.NioClient;
importcom.todd.nio.client.NioClientHandler;
importcom.todd.nio.utils.message.MessageContext;
importcom.todd.nio.utils.state.SimpleClientState;
/**
*登陆界面控制器
*
*@FilenameLoginController.java
*@Description
*@Version1.0
*@AuthorTodd
*@Emaillidetao0@163.com
*
*@History
*<li>Author:Todd</li>
*<li>Date:2015年1月28日</li>
*
*/
publicclassLoginController{
@FXML
privateLabel loginMsg;
@FXML
privateAnchorPane paneMain;
@FXML
privateTextField account;
@FXML
privatePasswordField password;
@FXML
privateButton submit;

@FXML
publicvoidonSubmitClicked(ActionEventevent)throwsException{
loginMsg.setText("start");
submit.setDisable(true);
if(SimpleClientState.isLogin()){
loginMsg.setText("已经登陆,请不要重复登陆.");
}
try{
NioClient.login(account.getText(),password.getText(),newNioClientHandler(){

@Override
publicvoidchannelReadLast(ChannelHandlerContextctx,MessageContextmsg)
throwsException{
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(Exceptione){
loginMsg.setText("连接服务器失败,请联系系统管理员.");
//e.printStackTrace();
}

}

@FXML
publicvoidonResetClicked(ActionEventevent){
loginMsg.setText("登陆失败,失败原因....");
account.setText("");
password.setText("");
System.out.println("clearbuttonclicked");
}

publicLabelgetLoginMsg(){
returnloginMsg;
}

//.......省略部分代码

}
这个是FXML的控制类
当我在handdel中调用loginMsg.setText()--代码中红色标注部分就会报错,请问我改怎么修改?
详细错误如下:
Exceptioninthread"nioEventLoopGroup-2-1"java.lang.IllegalStateException:NotonFXapplicationthread;currentThread=nioEventLoopGroup-2-1
atcom.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204)
atcom.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:364)
atjavafx.scene.Parent$2.onProposedChange(Parent.java:364)
atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)
atcom.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)
atcom.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575)
atcom.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204)
atcom.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49)
atcom.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda$registerChangeListener$60(BehaviorSkinBase.java:197)
atcom.sun.javafx.scene.control.skin.BehaviorSkinBase$$Lambda$92/14449400.call(UnknownSource)
atcom.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(MultiplePropertyChangeListenerHandler.java:55)
atjavafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)
atcom.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
atcom.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
atjavafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103)
atjavafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110)
atjavafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:143)
atjavafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
atjavafx.beans.property.StringProperty.setValue(StringProperty.java:65)
atjavafx.scene.control.Labeled.setText(Labeled.java:146)
atcom.todd.nio.client.ui.controller.LoginController$1.channelReadLast(LoginController.java:61)
atcom.todd.nio.client.NioClientHandler.channelRead0(NioClientHandler.java:35)
atcom.todd.nio.client.NioClientHandler.channelRead0(NioClientHandler.java:1)
atio.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
atio.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
atio.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
atio.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
atio.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
atio.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
atio.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
atio.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
atio.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
atio.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
atio.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
atio.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
atio.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
atio.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
atjava.lang.Thread.run(Thread.java:745)

1 个解决方案

#1


升级到Netty4了?Netty4的线程模型发生了变化,响应消息由NioEventLoop线程异步执行,业务线程返回;NioClient发送了一个消息,NioClientHandler里面处理的线程已经不是原来的线程了,得用线程安全的方式操作web控件。

更多相关文章

  1. Java多线程之Thread、Runnable、Callable及线程池
  2. Java,Socket&TCP编程 实现多线程端对端通信与文件传输
  3. Java错误:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsE
  4. Java并发面试题:三个线程轮流打印十次abc
  5. 【java】线程安全的整型类AtomicInteger
  6. Java多线程编程
  7. 线程“main”中的异常java.lang.RuntimeException:无法编译的源代
  8. C/C++比java效率高的原因?
  9. Java ThreadPoolExecutor 线程池调度器

随机推荐

  1. android 设置壁纸几种方法
  2. Android上的命令内存相关
  3. android操作xml
  4. Android内核的根文件系统
  5. Android 常用布局
  6. Android动画一
  7. Android常见错误解析
  8. android 技术
  9. Android组件的样式
  10. Android进程和线程