我想有一个名为save()
的方法,它应该将右侧面板中的计算机部件列表编组为XML文件。相反,另一个名为load()
的方法应该将保存的XML文件解组回一个对象。
基本上,“Save”事件将调用save()
方法并将右侧面板中的部件列表保存到XML文件中。 “加载”事件应清除右侧面板,并调用load()
方法。
调用load()
时,它应在右侧面板中显示未编组的数据。我让“退出”工作了。
我很难搞清楚“加载”和“保存”部分。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PCParts implements ActionListener{
JList destinationList, sourceList;
JButton buttonin, buttonout;
DefaultListModel source, destination;
public JPanel createContentPane (){
JPanel totalGUI = new JPanel();
source = new DefaultListModel();
destination = new DefaultListModel();
String shoppingItems[] = {"Case", "Motherboard", "CPU", "RAM", "GPU",
"HDD", "PSU"};
for(int i = 0; i < shoppingItems.length; i++)
{
source.addElement(shoppingItems[i]);
}
destinationList = new JList(source);
destinationList.setVisibleRowCount(10);
destinationList.setFixedCellHeight(20);
destinationList.setFixedCellWidth(140);
destinationList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
JScrollPane list1 = new JScrollPane(destinationList);
sourceList = new JList(destination);
sourceList.setVisibleRowCount(10);
sourceList.setFixedCellHeight(20);
sourceList.setFixedCellWidth(140);
sourceList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
JScrollPane list2 = new JScrollPane(sourceList);
JPanel buttonPanel = new JPanel();
buttonin = new JButton(">>");
buttonin.setHorizontalAlignment(SwingConstants.RIGHT);
buttonin.addActionListener(this);
buttonPanel.add(buttonin);
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS));
bottomPanel.add(Box.createRigidArea(new Dimension(10,0)));
bottomPanel.add(list1);
bottomPanel.add(Box.createRigidArea(new Dimension(5,0)));
bottomPanel.add(buttonPanel);
buttonout = new JButton("<<");
buttonout.addActionListener(this);
buttonPanel.add(buttonout);
bottomPanel.add(Box.createRigidArea(new Dimension(5,0)));
bottomPanel.add(list2);
bottomPanel.add(Box.createRigidArea(new Dimension(10,0)));
totalGUI.add(bottomPanel);
totalGUI.setOpaque(true);
return totalGUI;
}
private JPanel createSquareJPanel(Color color, int size) {
JPanel tempPanel = new JPanel();
tempPanel.setBackground(color);
tempPanel.setMinimumSize(new Dimension(size, size));
tempPanel.setMaximumSize(new Dimension(size, size));
tempPanel.setPreferredSize(new Dimension(size, size));
return tempPanel;
}
public void actionPerformed(ActionEvent e)
{
int i = 0;
if(e.getSource() == buttonin)
{
int[] fromindex = destinationList.getSelectedIndices();
Object[] from = destinationList.getSelectedValues();
for(i = 0; i < from.length; i++)
{
destination.addElement(from[i]);
}
for(i = (fromindex.length-1); i >=0; i--)
{
source.remove(fromindex[i]);
}
}
else if(e.getSource() == buttonout)
{
Object[] to = sourceList.getSelectedValues();
int[] toindex = sourceList.getSelectedIndices();
for(i = 0; i < to.length; i++)
{
source.addElement(to[i]);
}
for(i = (toindex.length-1); i >=0; i--)
{
destination.remove(toindex[i]);
}
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("PC Parts Builder");
JMenu file = new JMenu ("File");
file.setMnemonic (KeyEvent.VK_F);
PCParts demo = new PCParts();
frame.setContentPane(demo.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu mnFile = new JMenu("File");
menuBar.add(mnFile);
JMenuItem item;
file.add(item = new JMenuItem("Load"));
item.setMnemonic (KeyEvent.VK_O);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOpenCommand();
}
private void doOpenCommand() {
// TODO Auto-generated method stub
}
});
mnFile.add(item);
JMenuItem mntmSave = new JMenuItem("Save");
mntmSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSaveCommand();
}
private void doSaveCommand() {
}
});
mnFile.add(mntmSave);
JMenuItem mntmNewMenuItem = new JMenuItem("Exit");
mntmNewMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
mnFile.add(mntmNewMenuItem);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 0 :(得分:4)
只需创建一个班级Parts
即可拥有List<String>
。然后你可以编组/解组该类的实例。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Parts {
@XmlElement(name = "part")
private List<String> part;
public List<String> getPart() { return part; }
public void setPart(List<String> part) { this.part = part; }
}
对于编组(保存),您可以使用Marshaller
类创建JAXBContext
来创建Parts
。只需在编组上调用marshal
。
See some of the overloaded marshal
methods(请注意File
)
private void doSaveCommand() throws Exception {
ArrayList<String> save = new ArrayList<>();
for (int i = 0; i < destination.size(); i++) {
save.add((String)destination.getElementAt(i));
}
Parts parts = new Parts();
parts.setPart(save);
JAXBContext context = JAXBContext.newInstance(Parts.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(parts, System.out);
}
请注意,您有一点设计问题。需要访问的DefaultListModels
可能是因为侦听器代码位于static
上下文中,而模型不是static
。我只是制作了模型static
以使其工作,但您想要重新设计一下代码。这是结果(标准输出 - 你将编组到文件)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parts>
<part>Case</part>
<part>Motherboard</part>
<part>CPU</part>
</parts>
我会让你自己解决这个问题。这应该可以帮到你。
部分资源