Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用model.reload()时的Java SwingWorker NullPointerException_Java_Swing_Swingworker - Fatal编程技术网

调用model.reload()时的Java SwingWorker 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线程内的JTree中。然后重新加载模型以更新UI。当我重新加载JTreeDefaultModel时,它抛出一个NullPointerException。有办法解决这个问题吗?还是我必须找到一种不同的方法

下面是正在发生的事情

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:不,但这是因为我认为异常的原因可能是代码中没有显示。