gpt4 book ai didi

java - 将 DefaultListModel 编码到 xml

转载 作者:行者123 更新时间:2023-11-30 11:14:27 25 4
gpt4 key购买 nike

我看过一些关于这个主题的帖子,但没有一个解决方案对我有用。我有一个名为 partsListRightDefaultListModel,它是我的窗口类的成员,我有一个名为 configuration 的内部类,其中包含一个 ArrayList,我想要填充 partsListRight 中的项目:

@XmlRootElement
class Configuration{
@XmlElement
private ArrayList<String> Component;


public Configuration(){
Component = new ArrayList<String>();
Object[] partsList = partsListRight.toArray();
for (Object object : partsList){
Component.add((String)object);
}
}
}

在我的窗口类中,我有一个save() 方法,它为ArrayList 组件编码:

public void save() {


Configuration configuration = new Configuration();

try{
File file = new File("C:\\configuration.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(configuration, file);
jaxbMarshaller.marshal(configuration, System.out);
} catch(JAXBException e){
e.printStackTrace();
}
}

但是,当我尝试运行此方法时,我收到错误消息,指出 Configuration 是一个非静态内部类,而 JAXB 无法处理这些错误。我不确定如何解决这个问题。非常感谢任何帮助!

最佳答案

您不需要内部类。我明白你这样做的原因是因为你想访问 DefaultListModel,但这是不必要的。您的 JAXB 模型类不必了解任何有关 gui 方面的信息。它只是简单地意味着建模。

也就是说,您的设计有点不对劲。相反,您应该将 Configuration 设为自己的类文件。您也不需要 Configuration 类的构造函数。只需为 List 提供一个 getter,并通过 save() 方法填充它。像这样的东西:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"component"
})
@XmlRootElement(name = "Configuration")
public class Configuration {

protected List<String> component;

public List<String> getComponent() {
if (component == null) {
component = new ArrayList<String>();
}
return this.component;
}
}

然后当您真正想要进行编码时,只需创建 Configuration 类,并用列表模型元素填充它。

Configuration config = new Configuration();
List<String> list = config.getComponent();
Object[] partsList = partsListRight.toArray();
for (Object object : partsList){
list.add((String)object);
}

JAXBContext context = JAXBContext.newInstance(
Configuration.class.getPackage().getName());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(config, System.out);

更新

Thanks for the reply; I tried using this and now I've got a new error. javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "com.cooksys.assessment" doesnt contain ObjectFactory.class or jaxb.index...

抱歉,我习惯于使用 xjc,您已经为您创建了一个 ObjectFactory。在你的情况下,只需像以前一样创建 JAXBContext,使用 Configuration.class,而不是 Configuration.class.getPackage().getName() ;

JAXBContext context = JAXBContext.newInstance(Configuration.class);

测试

import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Marshall {

public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Configuration.class);
Marshaller marshaller = context.createMarshaller();
Configuration config = new Configuration();
List<String> list = config.getComponent();
list.add("Hello");
list.add("World");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(config, System.out);
}
}

结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration>
<component>Hello</component>
<component>World</component>
</Configuration>

注意:使用您当前的注释配置会是一样的(同样,xjc 创建上面的注释:-)

@XmlRootElement(name = "Configuration")
public class Configuration {

@XmlElement
protected List<String> component;

public List<String> getComponent() {
if (component == null) {
component = new ArrayList<String>();
}
return this.component;
}
}

关于java - 将 DefaultListModel 编码到 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com