Posted: November 3rd, 2010 | Filed under: Programmieren | Tags: Beispiel, Checkbox, Example, JCheckBox, JList, List, ListCellRenderer, ListModel, toString(), Tutorial | 7 Comments »
Für mein neustes Programm jCalFilter, welches Einträge in einem Kalender im ICS-Format filtern kann, habe ich eine JList gebraucht in der ich Termine auswählen kann. Dafür eignete sich am Besten eine JList die JCheckboxes beinhaltet. Mit diesem kleinen Tutorial möchte ich euch zeugen wie ihr das realisieren könnt.
Das fertige Programm soll so aussehen:
Als Datenkapsel verwende ich ein Objekt Person welches lediglich die Informationen Vorname, Name und Alter abspeichert. Des weiteren bietet die Klasse Person noch eine toString()-Methode. In dieser wird der Text zurückgegeben der jeweils in der Liste angezeigt werden soll.
Person.java
public class Person { private String name; private String vorname; private int alter; public Person(String name, String vorname, int alter){ this.name = name; this.vorname = vorname; this.alter = alter; } 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 int getAlter() { return alter; } public void setAlter(int alter) { this.alter = alter; } @Override public String toString() { return vorname + " " + name + " (" + alter + ")"; } } |
Nun kommen wir zum eigentlichen Kern der Implementierung. Die Klasse JCheckBoxList erbt einfach von JList. Diese beinhaltet einen ListCellRenderer in dem Formatierungen verändert werden können. Zusätzlich bietet die Klasse JCheckBoxList eine Methode selectAll() und deselectAll() an, um eben alle Häkchen zu setzten oder um die Auswahl aller Häkchen zu entfernen.
JCheckBoxList.java
import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JCheckBox; import javax.swing.JList; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.UIManager; public class JCheckBoxList extends JList { public JCheckBoxList() { setCellRenderer(new CellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index != -1) { JCheckBox checkbox = (JCheckBox) getModel().getElementAt( index); checkbox.setSelected(!checkbox.isSelected()); repaint(); } } }); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } protected class CellRenderer implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkbox = (JCheckBox) value; if (isSelected) { // checkbox.setBorderPainted(true); // checkbox.setForeground(UIManager.getColor("List.selectionForeground")); // checkbox.setBackground(UIManager.getColor("List.selectionBackground")); } else { // checkbox.setBorderPainted(false); // checkbox.setForeground(UIManager.getColor("List.foreground")); checkbox.setBackground(UIManager.getColor("List.background")); } return checkbox; } } public void selectAll() { int size = this.getModel().getSize(); for (int i = 0; i < size; i++) { JCheckBox checkbox = (JCheckboxWithObject) this.getModel() .getElementAt(i); checkbox.setSelected(true); } this.repaint(); } public void deselectAll() { int size = this.getModel().getSize(); for (int i = 0; i < size; i++) { JCheckBox checkbox = (JCheckboxWithObject) this.getModel() .getElementAt(i); checkbox.setSelected(false); } this.repaint(); } } |
Um die Verbindung zwischen einer Person und der Checkbox herzustellen habe ich das Objekt JCheckboxWithObject erstellt. Diese Klasse erbt von JCheckBox aber beinhaltet zusätzlich noch ein Objekt vom Typ Object in dem man irgendein Objekt ablegen kann. In unserem Fall ein Objekt vom Typ Person. Die Checkbox wird, im Konstruktor und der Setter-Methode, nun mit dem Rückgabestring der toString()-Methode des jeweiligen Objektes(Person) beschriftet.
JCheckboxWithObject.java
import javax.swing.JCheckBox; public class JCheckboxWithObject extends JCheckBox{ private Object object; public JCheckboxWithObject (Object object){ this.object = object; this.setText(object.toString()); } public Object getObject() { return object; } public void setObject(Object object) { this.object = object; this.setText(object.toString()); } } |
Nun kann die Datenstruktur wie folgt angewendet werden. Das Ergebnis seht ihr ja oben.
Main.java
import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.UIManager; public class Main { { // Set Look & Feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { // Fenster JFrame frame = new JFrame(); // Checkboxliste DefaultListModel personenListModel = new DefaultListModel(); JCheckBoxList list = new JCheckBoxList(); list.setModel(personenListModel); // Daten hinzufügen Person hans = new Person("Wurst", "Hans", 24); Person peter = new Person("Müller", "Peter", 36); Person klaus = new Person("Wagner", "Klaus", 29); JCheckboxWithObject hansCheckbox = new JCheckboxWithObject(hans); JCheckboxWithObject peterCheckbox = new JCheckboxWithObject( peter); JCheckboxWithObject klausCheckbox = new JCheckboxWithObject( klaus); personenListModel.addElement(hansCheckbox); personenListModel.addElement(peterCheckbox); personenListModel.addElement(klausCheckbox); frame.getContentPane().add(list); frame.setVisible(true); frame.setTitle("JCheckbox in JList"); frame.setSize(200, 200); } }); } } |
Download
Hier könnt ihr euch denn ganzen Quellcode herunterladen.
Posted: September 26th, 2010 | Filed under: Programmieren, Tutorials | Tags: automatisch nach unten scrollen, Beispiel, Example, Java, JFrame, JList, JScrollPane, Scroll down | No Comments »
Ich schreibe gerade an einem Programm welches alle Festplattenaktivitäten in einer JList auflistet. Da sehr viele Aktionen anfallen möchte ich dass die, von einer ScrollPane umgebene, JList automatisch nach unten scrollt sobald ein Eintrag hinzugefügt wird. Quasi ein JList Auto-Scroll Down. Das Java-Beispielprogramm sieht folgendermaßen aus.
Screenshot
Quellcode
Und hier der erlösende Quellcode dazu.
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; public class Main extends JFrame { private JList jList; private JScrollPane jScrollPane; private DefaultListModel defaultListModel; private JButton jButton; public Main() { super(); initGUI(); } private void initGUI() { try { BorderLayout thisLayout = new BorderLayout(); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.getContentPane().setLayout(thisLayout); defaultListModel = new DefaultListModel(); jList = new JList(); jList.setModel(defaultListModel); jScrollPane = new JScrollPane(); jScrollPane.setPreferredSize(new java.awt.Dimension(392, 245)); jScrollPane.setViewportView(jList); jButton = new JButton(); jButton.setText("add"); jButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { // Wichtig ist dass das Hinzufügen alles in einem seperaten // Thread abläuft damit die Oberfläche nicht hängen bleibt // und damit es keine Fehler beim dem Scrollen gibt(IndexOutOfBoundsException). SwingUtilities.invokeLater(new Runnable() { public void run() { // Element dem DefaultListModel hinzufügen. // Angezeigt wird dann die toString Methode des // Objektes, in diesem Fall ist das der String // selbst. defaultListModel.addElement(new String(System.currentTimeMillis() + "")); // Anschließend den letzten index des Model sichtbar setzen, // dies Bewirkt den automatischen Scroll nach unten. jList.ensureIndexIsVisible(defaultListModel.size() - 1); } }); } }); this.getContentPane().add(jScrollPane, BorderLayout.CENTER); this.getContentPane().add(jButton, BorderLayout.SOUTH); this.setTitle("JList Auto-Scroll Beispiel"); this.pack(); this.setSize(400, 300); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main inst = new Main(); inst.setLocationRelativeTo(null); inst.setVisible(true); } }); } } |
Download
Main.java
Ich hoffe ich konnte einigen von euch helfen.
Posted: Juli 16th, 2010 | Filed under: Internet, Programmieren, Tutorials | Tags: Beispiel, JAVA SAX Beispiel, JAVA SAX Tutorial, SAX, SAX Parser, XML Parsen | 20 Comments »
„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 ]]
Posted: Dezember 29th, 2008 | Filed under: Programmieren | Tags: Beispiel, Java, JFrame JMenuBar, JMenuBar, JMenuBar Beispiel, JMenuBar Example, JScrollPane, MenuBar, Menüleiste, Tutorial | 11 Comments »
Hallo Leute, heute wollte ich euch zeigen wie man eine Menüleiste in Java realisiert.
Dazu erstellen wir ein JFrame und fügen diesem eine JMenuBar hinzu. Die JMenuBar gibt das Rahmenwerk für das jeweilige JMenu. Ein JMenu repräsentiert ein Navigationspunkt. Um Menüunterpunkte zu erzeugen fügen wir unserem JMenu ein JMenuItem hinzu. So einfach geht’s.
JMenuBar -> JMenu (z.B.: Hilfe) -> JMenuItem (z.B.: Über)
Am Besten ihr schaut euch den folgenden Quellcode an.
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar; import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class JMenuBarBeispiel implements ActionListener {
JFrame applikation;
Container container;
// Menüleiste
JMenuBar menueLeiste;
// Menüleiste Elemente
JMenu datei;
JMenu hilfe;
// Datei JMenuItem oeffnen;
JMenuItem beenden;
// Hilfe JMenuItem faq;
JMenuItem about;
// Textfeld
JTextArea textarea;
public JMenuBarBeispiel() {
applikation = new JFrame("JMenuBar Beispiel");
container = applikation.getContentPane();
// Menüleiste erzeugen
menueLeiste = new JMenuBar();
// Menüelemente erzeugen
datei = new JMenu("Datei"); hilfe = new JMenu("Hilfe");
// Untermenüelemente erzeugen
oeffnen = new JMenuItem("öffnen");
oeffnen.addActionListener(this);
beenden = new JMenuItem("beenden");
beenden.addActionListener(this);
faq = new JMenuItem("F.A.Q.");
faq.addActionListener(this);
about = new JMenuItem("Über");
about.addActionListener(this);
// Menüelemente hinzufügen
menueLeiste.add(datei);
menueLeiste.add(hilfe);
// Untermenüelemente hinzufügen
datei.add(oeffnen);
datei.add(beenden);
hilfe.add(faq);
hilfe.add(about);
// Textfeld erzeugen
textarea = new JTextArea();
applikation.add(menueLeiste, BorderLayout.NORTH);
applikation.add(new JScrollPane(textarea), BorderLayout.CENTER);
applikation.setSize(400, 300);
applikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
applikation.setVisible(true);
}
public void actionPerformed(ActionEvent object) {
if (object.getSource() == oeffnen){
System.out.println("öffnen wurde angeklickt");
}
if (object.getSource() == beenden){
System.out.println("beenden wurde angeklickt");
}
if (object.getSource() == faq){
System.out.println("faq wurde angeklickt");
}
if (object.getSource() == about){
System.out.println("über wurde angeklickt");
}
}
public static void main(String[] args) {
new JMenuBarBeispiel();
}
} |
Hier könnt ihr den Quellcode als Textdatei herunterladen.
Viel Spaß beim weiteren Programmieren. Ihr könnt mein Programm natürlich auch gerne als Vorlage verwenden.