Für einen MP3 Player will ich die GUI flexibel gestaltbar machen und das aktuelle Layout in einer XML-Datei speichern. Da in der XML-Datei nur Strings gespeichert werden ist die Verarbeitung relativ unhandlich. Vergleiche sind schwer durchzuführen und dass Umwandeln von Integer und String nervt. Geht das nicht eleganter?
[highlight="java"]
public class PropertyDialogXML {
public static void savePreferences(SplitablePanelView panel) {
try {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(new FileOutputStream("properties.xml"));
writer.writeStartDocument();
saveSplitPanelView(panel, writer);
writer.writeEndDocument();
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
private static void saveSplitPanelView(Component component, XMLStreamWriter writer) throws Exception{
String elementName = component.getClass().getSimpleName();
// SplitablePanelView
if (component instanceof SplitablePanelView) {
SplitablePanelView panel = (SplitablePanelView) component;
if (panel.getComponents().length == 0) {
writer.writeStartElement("Empty");
writer.writeEndElement();
return;
}
saveSplitPanelView(panel.getComponent(0), writer);
// JSplitPane
} else if (component instanceof JSplitPane) {
JSplitPane pane = (JSplitPane) component;
writer.writeStartElement("JSplitPane");
writer.writeAttribute("width", String.valueOf(component.getWidth()));
writer.writeAttribute("height", String.valueOf(component.getHeight()));
writer.writeAttribute("orientation", String.valueOf(pane.getOrientation()));
writer.writeAttribute("dividerLocation", String.valueOf(pane.getDividerLocation()));
saveSplitPanelView(pane.getLeftComponent(), writer);
saveSplitPanelView(pane.getRightComponent(), writer);
writer.writeEndElement();
// Player/Libraray/Playlist
} else {
writer.writeStartElement(elementName);
writer.writeAttribute("width", String.valueOf(component.getWidth()));
writer.writeAttribute("height", String.valueOf(component.getHeight()));
writer.writeEndElement();
}
}
public static void loadPreferences(SplitablePanelView panel) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(new FileInputStream("properties.xml"));
loadSplitPanelLayout(panel, parser);
// Minimale Größe, bei leerem Inhalt
if (panel.getComponents().length == 0)
panel.setPreferredSize(new Dimension(320,80));
parser.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void loadSplitPanelLayout(SplitablePanelView panel, XMLStreamReader parser) throws XMLStreamException {
// Ende
if (!parser.hasNext()) return;
// Kein Startelement
if (parser.getEventType() != XMLStreamConstants.START_ELEMENT) {
parser.next();
loadSplitPanelLayout(panel, parser);
}
// SplitPane
else if (parser.getLocalName().equals("JSplitPane")) {
int orientation = 0;
int dividerLocation = -1;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeLocalName(i).equals("orientation")) {
orientation = Integer.parseInt(parser.getAttributeValue(i));
} else if (parser.getAttributeLocalName(i).equals("dividerLocation")) {
dividerLocation = Integer.parseInt(parser.getAttributeValue(i));
}
}
SplitablePanelView[] returnVal = panel.addSplitPane(orientation, dividerLocation);
parser.next();
loadSplitPanelLayout(returnVal[0], parser);
loadSplitPanelLayout(returnVal[1], parser);
// Leer
} else if (parser.getLocalName().equals("Empty")) {
parser.next();
return;
// Playlist/Player/Library
} else {
int width = 0;
int height = 0;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeLocalName(i).equals("width"))
width = Integer.parseInt(parser.getAttributeValue(i));
else if (parser.getAttributeLocalName(i).equals("height"))
height = Integer.parseInt(parser.getAttributeValue(i));
}
panel.addComponent(parser.getLocalName(), width, height);
parser.next();
return;
}
}
}
[/highlight]
[highlight="java"]
public class PropertyDialogXML {
public static void savePreferences(SplitablePanelView panel) {
try {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(new FileOutputStream("properties.xml"));
writer.writeStartDocument();
saveSplitPanelView(panel, writer);
writer.writeEndDocument();
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
private static void saveSplitPanelView(Component component, XMLStreamWriter writer) throws Exception{
String elementName = component.getClass().getSimpleName();
// SplitablePanelView
if (component instanceof SplitablePanelView) {
SplitablePanelView panel = (SplitablePanelView) component;
if (panel.getComponents().length == 0) {
writer.writeStartElement("Empty");
writer.writeEndElement();
return;
}
saveSplitPanelView(panel.getComponent(0), writer);
// JSplitPane
} else if (component instanceof JSplitPane) {
JSplitPane pane = (JSplitPane) component;
writer.writeStartElement("JSplitPane");
writer.writeAttribute("width", String.valueOf(component.getWidth()));
writer.writeAttribute("height", String.valueOf(component.getHeight()));
writer.writeAttribute("orientation", String.valueOf(pane.getOrientation()));
writer.writeAttribute("dividerLocation", String.valueOf(pane.getDividerLocation()));
saveSplitPanelView(pane.getLeftComponent(), writer);
saveSplitPanelView(pane.getRightComponent(), writer);
writer.writeEndElement();
// Player/Libraray/Playlist
} else {
writer.writeStartElement(elementName);
writer.writeAttribute("width", String.valueOf(component.getWidth()));
writer.writeAttribute("height", String.valueOf(component.getHeight()));
writer.writeEndElement();
}
}
public static void loadPreferences(SplitablePanelView panel) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(new FileInputStream("properties.xml"));
loadSplitPanelLayout(panel, parser);
// Minimale Größe, bei leerem Inhalt
if (panel.getComponents().length == 0)
panel.setPreferredSize(new Dimension(320,80));
parser.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void loadSplitPanelLayout(SplitablePanelView panel, XMLStreamReader parser) throws XMLStreamException {
// Ende
if (!parser.hasNext()) return;
// Kein Startelement
if (parser.getEventType() != XMLStreamConstants.START_ELEMENT) {
parser.next();
loadSplitPanelLayout(panel, parser);
}
// SplitPane
else if (parser.getLocalName().equals("JSplitPane")) {
int orientation = 0;
int dividerLocation = -1;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeLocalName(i).equals("orientation")) {
orientation = Integer.parseInt(parser.getAttributeValue(i));
} else if (parser.getAttributeLocalName(i).equals("dividerLocation")) {
dividerLocation = Integer.parseInt(parser.getAttributeValue(i));
}
}
SplitablePanelView[] returnVal = panel.addSplitPane(orientation, dividerLocation);
parser.next();
loadSplitPanelLayout(returnVal[0], parser);
loadSplitPanelLayout(returnVal[1], parser);
// Leer
} else if (parser.getLocalName().equals("Empty")) {
parser.next();
return;
// Playlist/Player/Library
} else {
int width = 0;
int height = 0;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeLocalName(i).equals("width"))
width = Integer.parseInt(parser.getAttributeValue(i));
else if (parser.getAttributeLocalName(i).equals("height"))
height = Integer.parseInt(parser.getAttributeValue(i));
}
panel.addComponent(parser.getLocalName(), width, height);
parser.next();
return;
}
}
}
[/highlight]