JXTaskPane
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(
"https://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.
1) JXTaskPane
gehört zur
SwingX-Bibliothek, die gesondert in den Classpath eingebunden werden
muss. Für weitere Informationen siehe SwingX.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.