调用model.reload()时的Java SwingWorker NullPointerException
我正在尝试将子节点添加到SwingWorker线程内的JTree中。然后重新加载模型以更新UI。当我重新加载JTreeDefaultModel时,它抛出一个NullPointerException。有办法解决这个问题吗?还是我必须找到一种不同的方法 下面是正在发生的事情调用model.reload()时的Java SwingWorker NullPointerException,java,swing,swingworker,Java,Swing,Swingworker,我正在尝试将子节点添加到SwingWorker线程内的JTree中。然后重新加载模型以更新UI。当我重新加载JTreeDefaultModel时,它抛出一个NullPointerException。有办法解决这个问题吗?还是我必须找到一种不同的方法 下面是正在发生的事情 SwingWorker worker = new SwingWorker<String, Void>() { @Override public String doInBackground() {
SwingWorker worker = new SwingWorker<String, Void>()
{
@Override public String doInBackground()
{
TimeUnit.SECONDS.sleep(2);
return "hello";
}
@Override public void done()
{
String response = "";
try {
response = this.get();
} catch (InterruptedException e) {
System.out.println(e);
} catch (ExecutionException e) {
System.out.println(e);
}
String device = "hello";
ArrayList<String> devices = new ArrayList<String>();
devices.add(device);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Devices");
DefaultTreeModel model = (DefaultTreeModel)this.deviceTree.getModel();
for (String device : devices)
{
DefaultMutableTreeNode child = new DefaultMutableTreeNode(device);
root.add(child);
model.insertNodeInto(child, root, 0);
}
// Null pointer exception!!!
model.reload();
}
};
worker.execute();
SwingWorker-worker=新的SwingWorker()
{
@重写公共字符串doInBackground()
{
时间单位。秒。睡眠(2);
回复“你好”;
}
@覆盖公共void done()
{
字符串响应=”;
试一试{
response=this.get();
}捕捉(中断异常e){
系统输出打印ln(e);
}捕获(执行例外){
系统输出打印ln(e);
}
String device=“hello”;
ArrayList设备=新的ArrayList();
设备。添加(设备);
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“设备”);
DefaultTreeModel=(DefaultTreeModel)this.deviceTree.getModel();
用于(字符串设备:设备)
{
DefaultMutableTreeNode子节点=新的DefaultMutableTreeNode(设备);
root.add(子级);
model.insertNodeInto(子级,根,0);
}
//空指针异常!!!
model.reload();
}
};
worker.execute();
1)移动
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Devices");
DefaultTreeModel model = (DefaultTreeModel)this.deviceTree.getModel();
从SwingWorker
class外部
不要更新根目录
和模型
,实际上这些对象
中没有任何内容
DefaultMutableTreeNode child = new DefaultMutableTreeNode(device);
root.add(child);
model.insertNodeInto(child, root, 0);
仅声明ArrayList devices=new ArrayList()
并将其返回为对象
如果SwingWorkers
结束(或decare作为私有变量),如果SwingWorkes
结束,则创建所有对象
for (String device : devices) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(device);
root.add(child);
model.insertNodeInto(child, root, 0);
}
另一个选项是declare;,但在这种情况下,为什么要关心这个呢
编辑:在这个屏幕的左侧(顶部)是标有SwingWorker的
按钮,读取所有103
线程堆栈跟踪在哪里?我不明白设备如何。添加(设备)
是有效的。device
在哪里初始化?哎呀,对不起,我会把它取出来,然后把堆栈跟踪放进去。我不认为我遵循了你的逻辑。你什么意思?“仅声明ArrayList设备=新建ArrayList@Chris你必须把JComponents
和它的值分开,在SwingWorker
里面不要创建任何JComponents
,JComponent的模型
,不管怎样,只要它的值就行了,就像我说的,阅读其他关于SwingWorker
的帖子,有很多方法可以选择,也许其中的一些帖子会告诉你更多…@mKorbel:可以像原始海报那样在SwingWorker's done方法中处理Swing代码,因为这保证会在EDT上调用。@Hovercraft:你知道它为什么会抛出异常吗?@Chris:不,但这是因为我认为异常的原因可能是代码中没有显示。