JXTaskPane

JXTaskPane1 ist ist ein Container, mit dem die schrittweise Abarbeitung von Aufgaben vorgegeben werden kann. Mehrere JXTaskPane werden üblicher- aber nicht notwendigerweise in einem JXTaskPaneContainer zusammengefasst.

Das Beispiel zeigt einen einfachen JXFrame , auf dem auf der linken Seite ein JPanel und auf der rechten Seite ein JXTaskPaneContainer mit drei JXTaskPane zu sehen ist. Jedes Pane kann für sich durch Klick auf das Icon animiert geöffnet werden. Es erscheint jeweils ein Link, dessen Aktivierung den Inhalt des Panels links ändert. Hierzu ist jedem Pane eine anonyme Action-Klasse zugeordnet.

Zu Beginn des Beispiel-Quelltextes werden in main() der Frame, das zentrale Panel mit einem Label, der JXTaskPaneContainer, ein Icon und die drei JXTaskPane erzeugt. Für jeden dieser Panes erfolgt danach eine Konfiguration, in der ihm ein Titel und die jeweilige Action übergeben wird und es anschließend auf den JXTaskPaneContainer gesetzt wird. Das erste Pane wird zudem durch seine Methode setSpecial() vorselektiert. Am Ende von main() werden die Komponenten auf den Frame gesetzt, der Frame auf die bekannte Art und Weise konfiguriert und schließlich sichtbar gesetzt.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXHyperlink;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
import org.jdesktop.swingx.hyperlink.HyperlinkAction;

public class JXTaskPaneBsp {

    public static void main(String[] args) {
        final JXFrame frame = new JXFrame("JXTaskPanel-Beispiel", true);
        final JPanel centerPanel = new JPanel(new GridLayout(1, 1));
        final JLabel centerLabel = new JLabel("Labeltext", JLabel.CENTER);
        centerPanel.add(centerLabel);

        final JXTaskPaneContainer taskPaneContainer = new JXTaskPaneContainer();
        final ImageIcon icon = new ImageIcon(
                ClassLoader.getSystemResource("img/exclamation.gif"));
        final JXTaskPane pane1 = new JXTaskPane();
        final JXTaskPane pane2 = new JXTaskPane();
        final JXTaskPane pane3 = new JXTaskPane();

        pane1.setTitle("Aufgabe 1");
        pane1.setSpecial(true);
        pane1.add(new AbstractAction("Markieren", icon) {
            public void actionPerformed(ActionEvent e) {
                String txt = centerLabel.getText();
                centerLabel.setText("<html><u>" + txt + "</u></html>");
                processCenter(centerPanel, centerLabel);
                collapseAll(taskPaneContainer);
            }
        });
        taskPaneContainer.add(pane1);

        pane2.setTitle("Aufgabe 2");
        pane2.add(new AbstractAction("Ă„ndern", icon) {
            public void actionPerformed(ActionEvent e) {
                centerLabel.setText("Text ge\u00E4ndert!");
                processCenter(centerPanel, centerLabel);
                collapseAll(taskPaneContainer);
            }
        });
        taskPaneContainer.add(pane2);

        pane3.setTitle("Aufgabe 3");
        pane3.add(new AbstractAction("Hyperlink setzen", icon) {
            public void actionPerformed(ActionEvent e) {
                HyperlinkAction linkAction = null;
                try {
                    linkAction = HyperlinkAction.createHyperlinkAction(new URI(
                            "http://javabeginners.de"));
                    linkAction.putValue(Action.NAME, "Javabeginners");
                } catch (URISyntaxException use) {
                    use.printStackTrace();
                }
                centerPanel.removeAll();
                JXHyperlink link = new JXHyperlink(linkAction);
                link.setHorizontalAlignment(SwingConstants.CENTER);
                processCenter(centerPanel, link);
                collapseAll(taskPaneContainer);
            }
        });
        taskPaneContainer.add(pane3);
        
        collapseAll(taskPaneContainer);

        frame.add(centerPanel, BorderLayout.CENTER);
        frame.add(taskPaneContainer, BorderLayout.EAST);
        frame.setStartPosition(JXFrame.StartPosition.CenterInScreen);
        frame.setLocationByPlatform(true);
        frame.setSize(300, 185);
        frame.setVisible(true);
    }

    private static void collapseAll(JXTaskPaneContainer container) {
        Component[] contArr = container.getComponents();
        for (Component c : contArr) {
            if (c instanceof JXTaskPane)
                ((JXTaskPane) c).setCollapsed(true);
        }
    }

    private static void processCenter(JPanel p, Component c) {
        p.removeAll();
        p.add(c);
        p.revalidate();
        p.repaint();
    }
}

Alle drei Aktionen sind vom Typ AbstractAction und haben gemeinsam, dass sie eine Komponente auf das zentrale JPanel setzen. Die Ausführung übernimmt hierbei die Methode processCenter(), in der zunächst die vorhandene Komponente entfernt und dann die neue gesetzt wird. Sie wird in den Methoden actionPerformed() aufgerufen, in denen die anzuzeigenden Komponenten zusammengestellt werden.
In den ersten beiden Fällen bestehen diese aus einfachen JLabel, deren Texte jeweils variiert werden. Im letzten Fall wird ein JXHyperlink auf das zentrale JPanel gesetzt. Er öffnet bei Anklicken ein Browserfenster und stellt die Verbindung zu javabeginners.de her. Hierzu muss diesem ein Objekt vom Typ HyperlinkAction übergeben werden.
JXHyperlink ist von JButton abgeleitet und kann als eigenständige Komponente nicht in einem JLabel dargestellt werden. Aus diesem Grund muss vorher das Label vom Panel entfernt werden.

JXTaskPane

1) JXTaskPane gehört zur SwingX-Bibliothek, die gesondert in den Classpath eingebunden werden muss. Für weitere Informationen siehe SwingX.