Bei diversen Projekten habe ich schon öfters auf eine sehr hilfreiche JAVA Klasse zugreifen müssen. Diese funktioniert wie in PHP. Die HTMLEntities Methode wandelt alle geeigneten Zeichen in entsprechende HTML-Codes um. Die Klasse kann natürlich noch viel mehr, ihr könnt sie euch hier herunterladen, http://sourceforge.net/projects/htmlentities.
“Simple Api for XML” (SAX) ist eine API zum Parsen(analysieren) von XML-Dateien. Ursprünglich wurde SAX in Java geschrieben ist mittlerweile aber auch in anderen Sprachen verfügbar.
Ich möchte hier ein kleines Beispiel geben um euch zu zeigen wie ihr, in der Praxis, den SAX-Parser benutzen könnt.
Angenommen ihr bekommt eine XML-Datei vorgelegt und sollt alle Personen in einer ArrayList abspeichern. In der XML-Datei befindet sich folgender Inhalt.
XML-Beispiel-Datei

Person.java
Das Personen Objekt repräsentiert eine Person in der XML-Beispiel Datei und dient lediglich als Datenhaltung für die Informationen.
package parser;
import java.util.Date;
public class Person {
private int id;
private String name;
private String vorname;
private Date geburtsdatum;
private String postleitzahl;
private String ort;
public Person() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVorname() {
return vorname;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public Date getGeburtsdatum() {
return geburtsdatum;
}
public void setGeburtsdatum(Date geburtsdatum) {
this.geburtsdatum = geburtsdatum;
}
public String getPostleitzahl() {
return postleitzahl;
}
public void setPostleitzahl(String postleitzahl) {
this.postleitzahl = postleitzahl;
}
public String getOrt() {
return ort;
}
public void setOrt(String ort) {
this.ort = ort;
}
@Override
public String toString() {
return "[[" + this.id + "] ["+ this.name + "] [" + this.vorname + "]" + " [" + this.ort
+ "] [" + this.postleitzahl + "] [" + this.geburtsdatum + " ]]";
}
} |
Main.java
Im Folgenden sieht man sehr gut wie man einen XMLReader initialisieren muss. Es besteht sogar die Möglichkeit dem SAX Parser eine DTD zu übergeben. Dies wurde aber in meinem Beispiel einfachheitshalber auskommentiert. Die eigentliche implementierung der SAX Parser Logik steckt jedoch im ContentHandler, dieser folgt anschließend.
package parser;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class Main {
public static void main(String[] args) {
try {
// XMLReader erzeugen
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
// Pfad zur XML Datei
FileReader reader = new FileReader("X:\\personen.xml");
InputSource inputSource = new InputSource(reader);
// DTD kann optional übergeben werden
// inputSource.setSystemId("X:\\personen.dtd");
// PersonenContentHandler wird übergeben
xmlReader.setContentHandler(new PersonenContentHandler());
// Parsen wird gestartet
xmlReader.parse(inputSource);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
} |
PersonenContentHandler.java
Beim Parsen der XML-Datei werden die jeweiligen ContentHandler Funktionen aufgerufen.
package parser;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class PersonenContentHandler implements ContentHandler {
private ArrayList<Person> allePersonen = new ArrayList<Person>();
private String currentValue;
private Person person;
// Aktuelle Zeichen die gelesen werden, werden in eine Zwischenvariable
// gespeichert
public void characters(char[] ch, int start, int length)
throws SAXException {
currentValue = new String(ch, start, length);
}
// Methode wird aufgerufen wenn der Parser zu einem Start-Tag kommt
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
if (localName.equals("person")) {
// Neue Person erzeugen
person = new Person();
// Attribut id wird in einen Integer umgewandelt und dann zu der
// jeweiligen Person gesetzt
person.setId(Integer.parseInt(atts.getValue("id")));
}
}
// Methode wird aufgerufen wenn der Parser zu einem End-Tag kommt
public void endElement(String uri, String localName, String qName)
throws SAXException {
// Name setzen
if (localName.equals("name")) {
person.setName(currentValue);
}
// Vorname setzen
if (localName.equals("vorname")) {
person.setVorname(currentValue);
}
// Datum parsen und setzen
if (localName.equals("geburtsdatum")) {
SimpleDateFormat datumsformat = new SimpleDateFormat("dd.MM.yyyy");
try {
Date date = datumsformat.parse(currentValue);
person.setGeburtsdatum(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
// Postleitzahl setzen
if (localName.equals("postleitzahl")) {
person.setPostleitzahl(currentValue);
}
// Ort setzen
if (localName.equals("ort")) {
person.setOrt(currentValue);
}
// Person in Personenliste abspeichern falls Person End-Tag erreicht
// wurde.
if (localName.equals("person")) {
allePersonen.add(person);
System.out.println(person);
}
}
public void endDocument() throws SAXException {}
public void endPrefixMapping(String prefix) throws SAXException {}
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {}
public void processingInstruction(String target, String data)
throws SAXException {}
public void setDocumentLocator(Locator locator) { }
public void skippedEntity(String name) throws SAXException {}
public void startDocument() throws SAXException {}
public void startPrefixMapping(String prefix, String uri)
throws SAXException {}
} |
Ausgabe
Nach dem durchlaufen des SAX Parsers befinden sich nun alle Personen in der ArrayList allePersonen.
[[1] [Mustermann] [Max] [Bierdorf] [54321] [Fri Nov 25 00:00:00 CET 1983 ]]
[[2] [Müller] [Petra] [Bierdorf] [76543] [Fri Apr 13 00:00:00 CEST 1990 ]]

Hier ein Regulärer Ausdruck oder Regular Expression für eine E-Mail-Adresse. Habe den Ausdruck mir selbst ausgedacht. Verbesserungsvorschläge nehme ich natürlich gerne an.Testen könnt ihr das ganze mit meinem RegularExpressionTester.
[A-Za-z0-9._%+-]+@{1}[A-Za-z0-9.-]+[.]{1}[A-Za-z]{2,4}
Beim schreiben eines Textfilters habe ich letzt eine kleine Funktion benötigt. Ich wollte gleiche Einträge in einer ArrayList herrauslöschen. Folgende Funktion löscht alle Duplikate.
public void removeDuplicatedEntries(ArrayList<String> arrayList) {
HashSet<String> hashSet = new HashSet<String>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
} |

geänderte Schriftfarbe in einer JList
Bei der Java GUI-Entwicklung bin ich in letzter Zeit immer öfters auf die Komponente JList gestoßen. Ich wollte euch nun zeigen wie ihr die Elemente in einer JList färben könnt. Ihr könnt sowohl die Schriftfarbe als auch die Hintergrundfarbe ändern. Dazu benötigen wir einen sogenannten ListCellRenderer. In unserem Beispiel möchten wir verschiedenen Personen, die wir zu einer JList hinzufügen, eine individuelle Schriftfarbe geben. Zunächst benötigen wir die Klasse “Person”, die eine Person mit einem Namen und einer Farbe repräsentiert.
Person.java
import java.awt.Color;
public class Person {
private String name;
private Color schriftfarbe;
public Person(String name, Color schriftfarbe){
this.name = name;
this.schriftfarbe = schriftfarbe;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Color getSchriftfarbe() {
return schriftfarbe;
}
public void setSchriftfarbe(Color schriftfarbe) {
this.schriftfarbe = schriftfarbe;
}
} |
Nun kommen wir zum ListCellRenderer. In unserem Beispiel nennen wir diesen “PersonListCellRenderer”. Dieser ListCellRenderer bestimmt das Aussehen der einzelnen Elemente in der List, implementiert die Klasse ListCellRenderer und ist ein Kindelement vom JLabel. Somit erreicht man also das die JList Elemente normale JLabels dargestellt werden. Wir können also all das machen das wir auch bei einem JLabel machen können. Wichtig ist das setOpaque auf true gesetzt wird. Mehr zu setOpaque findest du hier.
PersonListCellRenderer.java
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
public class PersonListCellRenderer extends JLabel implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Wert aus der Liste wird als Person interpretiert (gecastet)
Person person = (Person) value;
// Name der Person wird als Text gesetzt
this.setText(person.getName());
// Muss aufgerufen werden ansonsten hat this.setBackground keine Wirkung
this.setOpaque(true);
// Element aus der Liste ist markiert
if(isSelected){
// Schriftfarbe
// UIManager.getColor("List.selectionForeground") gibt die
// Standard Schriftfarbe für ein markiertes Listen Element zurück
this.setForeground(UIManager.getColor("List.selectionForeground"));
// Hintergrund
// UIManager.getColor("List.selectionBackground") gibt die
// Standard Hintergrundfarbe für ein markiertes Listen Element zurück
this.setBackground(UIManager.getColor("List.selectionBackground"));
}
// Element aus der Liste ist nicht markiert
else{
// Schriftfarbe
this.setForeground(person.getSchriftfarbe());
// Hintergrund
this.setBackground(UIManager.getColor("List.background"));
}
// Das Label wird zurückgegeben und nun angezeigt
return this;
}
} |
Die Variable isSelected enthält die Information ob das jeweilige Element markiert ist oder nicht. Dementsprechend kann man verschiedene Farben für den jeweiligen Fall definieren. Über den UI Manager hat man die Möglichkeit Standardwerte auszulesen. Aus dem Quellcode geht hervor das wir die Hintergrundfarbe einfach vom Standard übernehmen und nur bei nichtmarkiertem Element erhält die jeweilige Person ihre Farbe. Alle möglichen Standardwerte des UI Managers können unter Java UI Manager Defaults nachgelesen werden. Schließlich wenden wir unseren ListCellRenderer auf eine JList an.
Beispiel Programm einer Liste
import java.awt.Color;
import java.awt.Container;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
public class Liste{
private JFrame frameApplikation;
private Container containerApplikation;
// Liste
private JList liste;
// Listen Modell
private DefaultListModel modell;
public Liste(){
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
e.printStackTrace();
}
frameApplikation = new JFrame();
frameApplikation.setTitle("Beispiel einer Liste mit bunter Schrift");
liste = new JList();
modell = new DefaultListModel();
liste.setModel(modell);
liste.setCellRenderer(new PersonListCellRenderer());
Person person1 = new Person("Stefan Raab", new Color(23, 59, 159));
Person person2 = new Person("Oliver Pocher", Color.GREEN);
Person person3 = new Person("Elton", new Color(244, 16, 159));
Person person4 = new Person("Hans-Martin", Color.RED);
modell.addElement(person1);
modell.addElement(person2);
modell.addElement(person3);
modell.addElement(person4);
containerApplikation = frameApplikation.getContentPane();
containerApplikation.add(liste);
frameApplikation.pack();
frameApplikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameApplikation.setVisible(true);
}
public static void main(String[] args) {
new Liste();
}
} |
Nächste Seite »