gpt4 book ai didi

java - 编码将 jlist 的菜单项保存到 XML 并解码加载菜单项

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

我一直在这里进行研究并一直在寻找问题的解决方案。我是java新手,所以我不知道所有的语法。我正在尝试让我的代码从保存和加载菜单项的创建方法传输项目。 save 事件处理程序应调用 save() 方法并将右侧面板中的部件列表保存到 XML 文件中。 load 事件处理程序应调用方法 load(),并且应在右侧面板中显示未编码的数据。我对 JAXB 或 XML 都不熟悉。我试图看看其他人是否做过类似的事情,但我无法完成代码。有人可以帮我吗?下面是整个代码。我已经找到了使用事件处理程序使其退出的解决方案,但我陷入了编码和解编保存和加载菜单项的困境。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Window {

private final JFrame frame;

public static void main(String[] args) {
EventQueue.invokeLater(() -> {
Window window = new Window();
window.frame.setVisible(true);

});
}

public Window() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

initialize();
}

public void initialize() {
//Creating the Panel for Menu Bar
JPanel panel = new JPanel();
panel.setBounds(0, 0, 434, 23);
frame.getContentPane().add(panel);
panel.setLayout(new BorderLayout(0, 0));
//Creating the Menu File Bar
JMenuBar bar = new JMenuBar();
panel.add(bar, BorderLayout.NORTH);
JMenu file = new JMenu("File");
JMenuItem load = new JMenuItem("Load");
JMenuItem save = new JMenuItem("Save");
JMenuItem exit = new JMenuItem("Exit");
file.add(load);
load.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {


}
});
file.add(save);
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {


}
});
file.add(exit);
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
bar.add(file);

//Populate Left List with part names
final DefaultListModel parts = new DefaultListModel();
parts.addElement("Case");
parts.addElement("Motherboard");
parts.addElement("CPU");
parts.addElement("GPU");
parts.addElement("PSU");
parts.addElement("RAM");
parts.addElement("HDD");

final JList leftList = new JList(parts);
leftList.setBounds(10, 26, 142, 224);
frame.getContentPane().add(leftList);

//create right list
final DefaultListModel partSelected = new DefaultListModel();
final JList rightList = new JList(partSelected);
rightList.setBounds(282, 26, 142, 224);
frame.getContentPane().add(rightList);

//add event to the button to move items from left list to right list
JButton btnNewButton = new JButton(">>");
btnNewButton.addActionListener((ActionEvent arg0) -> {
for (Object selectedValue : leftList.getSelectedValuesList()) {
partSelected.addElement(selectedValue);
parts.removeElement(selectedValue);
int iSelected = leftList.getSelectedIndex();
if (iSelected == -1) {
return;
}
}
});
btnNewButton.setBounds(172, 86, 89, 23);
frame.getContentPane().add(btnNewButton);

//Remove Button
JButton remove = new JButton("<<");
remove.addActionListener((ActionEvent arg0) -> {
for (Object selectedValue : rightList.getSelectedValuesList()) {
parts.addElement(selectedValue);
partSelected.removeElement(selectedValue);
int selected = rightList.getSelectedIndex();
if (selected == -1) {
return;
}
}
});
remove.setBounds(172, 140, 89, 23);
frame.getContentPane().add(remove);
}
}

最佳答案

好的,所以您首先需要了解 JAXB 旨在将对象序列化到 XML 或从 XML 序列化对象(通过使用注释)。

因此,您首先需要的是某种要序列化的对象,其中包含您的产品。一个ListModel似乎是一个完美的选择,除了它不是为任务设置的,它没有注释,JAXB 可以通过注释来决定应该序列化或不序列化什么

所以,我们需要创建一个......

@XmlRootElement
public static class ProductListModel extends AbstractListModel<String> {

private List<String> products;

public ProductListModel() {
products = new ArrayList<>(25);
}

@XmlElementWrapper
public List<String> getProducts() {
return products;
}

public void add(String product) {
products.add(product);
fireIntervalAdded(this, products.size() - 1, products.size() - 1);
}

public void remove(String product) {
int index = products.indexOf(product);
products.remove(product);
fireIntervalAdded(this, index, index);
}

@Override
public int getSize() {
return products.size();
}

@Override
public String getElementAt(int index) {
return products.get(index);
}
}

(现在,您可能会说 ArrayList 之类的东西可能会更好,但我想说,这扩展了类(class),但几乎没有 yield ,甚至没有 yield ,并且当您尝试计算时,可能需要做更多的工作知道如何序列化它的缓冲区)

接下来,我们需要访问 rightList initialize之外方法,因为你的 loadsave方法会想要这个。我们可以使用ListModel ,但是当我们加载它时,我们需要一些东西来将它应用到任何方式......

//...
private JList rightList;

public void initialize() {
//...
final ProductListModel parts = new ProductListModel();
parts.add("Case");
parts.add("Motherboard");
parts.add("CPU");
parts.add("GPU");
parts.add("PSU");
parts.add("RAM");
parts.add("HDD");

leftList = new JList(parts);
leftList.setBounds(10, 26, 142, 224);
frame.getContentPane().add(leftList);

//create right list
final ProductListModel partSelected = new ProductListModel();
//JList rightList = new JList(partSelected);
rightList = new JList(partSelected);

这也改变了 DefaultListModel 的使用至ProductListModel 。从技术上讲,这仅适用于 rightList ,但自从我更改了 addremove ListModel 的方法名称(这将导致编译器错误,因此您需要更新它们),它只会让生活更轻松。

现在我们需要的是saveload方法...

protected void save() {
ProductListModel model = (ProductListModel) rightList.getModel();

try {
File file = new File("Products.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(ProductListModel.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(model, file);
jaxbMarshaller.marshal(model, System.out);
} catch (JAXBException exp) {
exp.printStackTrace();
}
}

protected void load() {
try {
File file = new File("Products.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(ProductListModel.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ProductListModel model = (ProductListModel) jaxbUnmarshaller.unmarshal(file);
rightList.setModel(model);
} catch (JAXBException exp) {
exp.printStackTrace();
}
}

您需要从ActionListener调用电话已注册到您的loadsave JMenuItem

看看JAXB hello world example (我用来设计解决方案)和 Introduction to JAXB了解更多详情。

您可能还想看看 How to Use Lists , How to Use Scroll PanesLaying Out Components Within a Container帮助改进您的用户界面

现在,当您加载ProductList时,您将需要弄清楚如何修改 leftList删除现在出现在右侧的项目;)

关于java - 编码将 jlist 的菜单项保存到 XML 并解码加载菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31579019/

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