java.lang.IllegalStateException: Problem in some module which uses Window System: Window System API is required to be called from AWT thread only, see http://core.netbeans.org/proposals/threading/
简单说明:
此问题出现的原因大概是:Window System API 只能被AWT 线程(主线程)调用。也可以简单理解为,在别的线程里面不能对netbeans的控件进行操作,比如给控件赋值等。
1.其他线程怎么操作【netbeans的控件】?
2.用设计模式中的一种【观察者模式】。线程只负责传值。观察者负责处理问题。
3.例子代码。( 代码不能直接使用)
4.ObserverBridgeRunnable.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ imports.. /** * 自定义线程 * @author gby */ public class ObserverBridgeRunnable implements Runnable { private DataObservable dataObservable; public ObserverBridgeRunnable(DataObservable DataObservable) { this.DataObservable = DataObservable; } @Override public void run() { HandledData handledData = new HandledData(); DataObservable.handleTcpData(handledData); } }
5.DataObservable.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ imports.. /** * 被观察者 * Tcp通讯被监视者 * @author gby */ public class DataObservable extends Observable { private static DataObservable instance = null; private DataObservable() { } public static synchronized DataObservable getInstance() { if (instance == null) { instance = new DataObservable(); } return instance; } public static DataObservable newInstance() { return new DataObservable(); } public void handleTcpData(Object data) { super.setChanged(); notifyObservers(data); } }
6.DataObserver.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ imports.. /** * 观察者 * @author gby */ public class DataObserver implements Observer { @Override public void update(Observable o, final Object arg) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { HandledData handledData = (HandledData) arg; // 处理数据 Manage.hanled(handledData); } }); } }
【4,5,6】为处理所需的类,【7】为调用方法。
7.调用方法
// 建立观察者模式 DataObservable DataObservable = DataObservable.newInstance(); DataObservable.addObserver(new DataObserver()); // 处理数据 ObserverBridgeRunnable observerBridgeRunnable = new ObserverBridgeRunnable(inputStreamReader, DataObservable); Thread thread = new Thread(observerBridgeRunnable); thread.start();
引用
Cobble.Ge 于 合肥 公司 20120525