{"id":3239,"date":"2015-11-25T19:35:13","date_gmt":"2015-11-25T17:35:13","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3239"},"modified":"2015-11-25T19:35:13","modified_gmt":"2015-11-25T17:35:13","slug":"inselraus-die-zusatzkomponentenbibliothek-swingx","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2015\/11\/inselraus-die-zusatzkomponentenbibliothek-swingx\/","title":{"rendered":"Inselraus: Die Zusatzkomponentenbibliothek SwingX"},"content":{"rendered":"<p>F\u00fcr ernsthafte grafische Oberfl\u00e4chen mit Swing sind die Standardkomponenten der Java SE etwas mau. Wichtige Komponenten wie ein Datumsauswahldialog fehlen, zum Teil sind die angebotenen Komponenten nicht leistungsf\u00e4hig genug. So kann beispielsweise die Swing-Textkomponente zwar einfaches HTML darstellen, scheitert aber an komplexeren Dokumenten mit CSS. Da die Java Foundation Classes in den letzten Jahren sehr stabil geblieben sind \u2013 es gab keine gro\u00dfen \u00c4nderungen oder nennenswerte neue Komponenten \u2013, bleibt Entwicklern nichts anderes \u00fcbrig, als entweder<\/p>\n<ul>\n<li>die ben\u00f6tigten Swing-Komponenten selbst zu entwickeln oder<\/li>\n<li>sich im Open-Source-Umfeld umzuschauen bzw.<\/li>\n<li>eine kommerzielle Swing-Komponentenbibliothek einzukaufen.<\/li>\n<\/ul>\n<p>Wie \u00fcblich ist die Eigenentwicklung immer nur die letzte Option. Im Laufe der letzten Jahre haben sich einige sehr gute quelloffene Swing-Zus\u00e4tze etabliert. Hervorzuheben ist SwingX, ein Projekt, von dem lange Zeit gedacht wurde, dass die Komponenten in das javax.swing-Paket aufgenommen w\u00fcrden. Das ist aber bisher nicht passiert, nur eine Komponente hat es \u2013 wen auch abgewandelt \u2013 in die Standardbibliothek geschafft.<\/p>\n<p><strong>Hinweis:<\/strong> Aktiv wird SwingX nicht mehr weiterentwickelt.<\/p>\n<h3>Im Angebot: Erweiterte und neue Swing-Komponenten<\/h3>\n<p>Die SwingX-Bibliothek erweitert Swing auf zwei Arten:<\/p>\n<ul>\n<li>Einige SwingX-Komponenten erweitern die Standard-Swing-Komponenten und f\u00fcgen Funktionalit\u00e4t hinzu. So ist JXFrame eine Unterklasse von JFrame und kann zum Beispiel eine Statuszeile haben. Oder JXTable ist eine Unterklasse von JTable mit zus\u00e4tzlicher Suchfunktionalit\u00e4t und dem Vorteil, dass sich Spalten automatisch ein-\/ausblenden lassen.<\/li>\n<li>SwingX definiert ganz neue Swing-Komponenten, etwa eine Mischung aus Tabelle und Baum (JXTreeTable), ausfaltbare Container oder einen Login-Dialog.<\/li>\n<\/ul>\n<p>Um einen ersten \u00dcberblick \u00fcber SwingX zu bekommen, lohnt es sich, einen Blick auf das SwingX-Demo zu werfen. Auf der SwingX-Homepage <a href=\"http:\/\/swingx.java.net\/\">http:\/\/swingx.java.net\/<\/a> wird auf die Web-Startapplikation verlinkt (http:\/\/swinglabs-demos.java.net\/demos\/swingxset6\/swingxset.jnlp).<\/p>\n<h3>\u00dcberblick \u00fcber erweiterte Standard-Swing-Klassen<\/h3>\n<p>SwingX nimmt einige Klassen als Basisklassen und f\u00fcgt Funktionalit\u00e4t hinzu. Die Standardkomponenten lassen sich problemlos gegen die neuen Klassen austauschen.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"196\">SwingX-Klasse<\/td>\n<td width=\"186\">Swing-Basisklasse<\/td>\n<td width=\"378\">Aufgabe<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXButton<\/td>\n<td width=\"186\">JButton<\/td>\n<td width=\"378\">Schaltfl\u00e4che mit Unterst\u00fctzung f\u00fcr Painter<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXLabel<\/td>\n<td width=\"186\">JLabel<\/td>\n<td width=\"378\">Beschriftung mit Unterst\u00fctzung f\u00fcr Painter<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXTable<\/td>\n<td width=\"186\">JTable<\/td>\n<td width=\"378\">stark erweiterte Tabelle mit Suche, Sortierung, Filterung, \u2026<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXList<\/td>\n<td width=\"186\">JList<\/td>\n<td width=\"378\">stark erweiterte Liste mit Suche, Sortierung, Filterung, \u2026<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXTree<\/td>\n<td width=\"186\">JTree<\/td>\n<td width=\"378\">stark erweiterter Baum mit Suche, Filterung, \u2026<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXFrame<\/td>\n<td width=\"186\">JFrame<\/td>\n<td width=\"378\">Fenster mit optionaler Statuszeile, Warte-zustand, \u2026<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXDialog<\/td>\n<td width=\"186\">JDialog<\/td>\n<td width=\"378\">Vereinfacht den Aufbau von Dialogen.<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXPanel<\/td>\n<td width=\"186\">JPanel<\/td>\n<td width=\"378\">Panel mit Transparenz und Painter<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXEditorPane<\/td>\n<td width=\"186\">JEditorPane<\/td>\n<td width=\"378\">verbesserte Editor-Funktionalit\u00e4t, Undo\/Redo und Suche<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXComboBox<\/td>\n<td width=\"186\">JComboBox<\/td>\n<td width=\"378\">Verbessert den Edit-Modus beim Einsatz in einer Tabelle.<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXFormattedTextField<\/td>\n<td width=\"186\">JFormattedTextField<\/td>\n<td width=\"378\">Unterst\u00fctzt Prompts und Buddies in formatierten Textzeilen.<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXTextArea<\/td>\n<td width=\"186\">JTextArea<\/td>\n<td width=\"378\">Unterst\u00fctzt Prompts und Buddies in Text-bereichen.<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXTextField<\/td>\n<td width=\"186\">JTextField<\/td>\n<td width=\"378\">Unterst\u00fctzt Prompts und Buddies in Text-zeilen.<\/td>\n<\/tr>\n<tr>\n<td width=\"196\">JXRootPanel<\/td>\n<td width=\"186\">JRootPanel<\/td>\n<td width=\"378\">Wurzelkomponente mit Symbolleiste und Statuszeile<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Erweiterte Standard-Swing-Klassen<\/p>\n<p>Die Klassen JXTable, JXList, JXTreeTable sind sehr leistungsf\u00e4hig und daher mit einem kleinen Satz kaum zu beschreiben. Die API-Dokumentation gibt mehr Informationen. Wichtig sind dabei Klassen aus dem Paket org.jdesktop.swingx.decorator, die f\u00fcr JXTable, JXTreeTable, JXTree und JXList Sortierung, Filterung und Hervorhebung unterst\u00fctzen.<\/p>\n<p>In den Zellen tauchen zudem die Begriffe Painter, Prompt und Buddy auf:<\/p>\n<ul>\n<li>Ein Painter ist ein Objekt, das an die SwingX-Komponente gesetzt wird. Zum Zeichnen greift die SwingX-Klasse auf das externe Zeichenobjekt zur\u00fcck. Der Vorteil ist, dass so keine Unterklassen n\u00f6tig sind, etwa von JButton oder JLabel, nur wenn in den Zeichenprozess eingegriffen werden soll.<\/li>\n<li>Prompts und Buddies zeigen bei JXTextField, JXFormattedTextField und JXTextArea Eingabehinweise oder Fehler.<\/li>\n<\/ul>\n<h3>Neue Swing-Klassen<\/h3>\n<p>Zus\u00e4tzlich zu den Erweiterungen der Standard-Swing-Komponenten bietet SwingX weitere Komponenten. Manche sind dringend n\u00f6tig, etwa zur Auswahl eines Datums, einige sind sehr speziell, etwa zum Zeichnen eines 2D-Graphen.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"214\">SwingX-Klasse<\/td>\n<td width=\"164\">Swing-Basisklasse<\/td>\n<td width=\"384\">Aufgabe<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXDatePicker<\/td>\n<td width=\"164\">JComponent<\/td>\n<td width=\"384\">Datumseingabe im Textfeld mit Popup-Men\u00fc<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXHyperlink<\/td>\n<td width=\"164\">JButton<\/td>\n<td width=\"384\">Hyperlink<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXBusyLabel<\/td>\n<td width=\"164\">JLabel<\/td>\n<td width=\"384\">Animation f\u00fcr Ladeprozesse<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTreeTable<\/td>\n<td width=\"164\">JXTable<\/td>\n<td width=\"384\">Verschmilzt Tabelle und Baum.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXStatusBar<\/td>\n<td width=\"164\">JComponent<\/td>\n<td width=\"384\">Statuszeile, in der Regel unten am Fenster<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXErrorPane<\/td>\n<td width=\"164\">JComponent<\/td>\n<td width=\"384\">Darstellung von Fehlermeldungen<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXMultiThumbSlider<\/td>\n<td width=\"164\">JComponent<\/td>\n<td width=\"384\">Slider mit zwei Kn\u00f6pfen<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXMonthView<\/td>\n<td width=\"164\">JComponent<\/td>\n<td width=\"384\">Zeigt Monatskalender und erlaubt Monats-auswahl.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXSearchField<\/td>\n<td width=\"164\">JXTextField<\/td>\n<td width=\"384\">Textfeld mit kleinem Such-Icon<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXRadioGroup<\/td>\n<td width=\"164\">JPanel<\/td>\n<td width=\"384\">Vereinfacht die ButtonGroup.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXMultiSplitPane<\/td>\n<td width=\"164\">JPanel<\/td>\n<td width=\"384\">geschachtelte Split-Panels<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXCollapsiblePane<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">animierte ausfaltbare Panels<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTaskPane<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Titel mit Icon zum Ausfalten der Container-elemente<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTaskPaneContainer<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Container f\u00fcr mehrere JXTaskPanes<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTipOfTheDay<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Gibt den \u201eTipp des Tages\u201c aus.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTitledPanel<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Panel mit \u00dcberschrift<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXTitledSeparator<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Trennlinie mit Text<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXImageView<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Zeigt ein Bild, ein neues kommt mit Drag &amp; Drop.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXColorSelectionButton<\/td>\n<td width=\"164\">JButton<\/td>\n<td width=\"384\">Zeigt bei Aktivierung einen Farbauswahldialog.<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXGradientChooser<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Panel zum Aufbau eines Farbverlaufs (-Gradient)<\/td>\n<\/tr>\n<tr>\n<td width=\"214\">JXGraph<\/td>\n<td width=\"164\">JXPanel<\/td>\n<td width=\"384\">Zeichnet 2D-Graphen.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Neue Klassen, die SwingX bietet<\/p>\n<p>Zur Suche geh\u00f6ren noch ein paar andere Komponenten, die nicht aufgef\u00fchrt sind. F\u00fcr die JXTable gibt es weiterhin JXTableHeader, was eine Spezialisierung von JTableHeader ist.<\/p>\n<h3>Weitere SwingX-Klassen<\/h3>\n<p>Des Weiteren gibt es ein paar neue Layoutmanager, etwa HorizontalLayout, VerticalLayout oder StackLayout (setzt alle Komponenten aufeinander). SwingX unterst\u00fctzt ebenfalls die Tastaturvervollst\u00e4ndigung bei Textfeldern und der Combo-Box. Beispiele finden sich im Paket org.jdesktop.swingx.autocomplete.<\/p>\n<h3>SwingX-Installation<\/h3>\n<p>Wer SwingX einsetzen m\u00f6chte, der l\u00e4dt von <a href=\"http:\/\/java.net\/downloads\/swingx\/releases\/\">http:\/\/java.net\/downloads\/swingx\/releases\/<\/a> das Java-Archiv swingx-all-1.6.4.jar (etwa 1,4 MiB) herunter und bindet es in den Klassenpfad ein. Auf den Seiten sind auch die Quellen und die Java-API-Dokumentation verlinkt. Nach dem Einbinden stehen die neuen Klassen unter dem Paket org.jdesktop.swingx zur Verf\u00fcgung.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr ernsthafte grafische Oberfl\u00e4chen mit Swing sind die Standardkomponenten der Java SE etwas mau. Wichtige Komponenten wie ein Datumsauswahldialog fehlen, zum Teil sind die angebotenen Komponenten nicht leistungsf\u00e4hig genug. So kann beispielsweise die Swing-Textkomponente zwar einfaches HTML darstellen, scheitert aber an komplexeren Dokumenten mit CSS. Da die Java Foundation Classes in den letzten Jahren sehr [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[10],"tags":[],"class_list":["post-3239","post","type-post","status-publish","format-standard","hentry","category-swing"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3239"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3239\/revisions"}],"predecessor-version":[{"id":3240,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3239\/revisions\/3240"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}