# Zugriff auf Elemente in Tabs von JTabbedPane?



## MadMax2581 (18. Juni 2007)

Hallo!

Sitze schon länger an einem Problem mit JTabbedPane und komme einfach nicht mehr weiter. Hoffe mir kann jemand weiterhelfen.

Ausgangssituation:
Schreibe gerade ein Programm bei dem mehrere Parameter noch zusätlich eingegeben werden sollen --> deren Anzahl sich aber in der Zukunft noch verändern kann und die dann auch erfasst werden müssen. Das ganze möchte ich mit einem JTabbedPane lösen, weil ich die geforderten Eingaben da in verschiedene Kategorien (einzelne Tabs des JTabbedPane) einteilen kann. Jetzt habe ich eine XML-Datei (config.xml) zum Konfigurieren der einzelnen Tabs geschrieben, jeder Tab kann Checkboxen, RadioButtons und Eingabefelder enthalten.
Bis dahin läuft alles ganz gut --> JTabbedPane ist erzeugt, einzelnen Tabs mit richtiger Beschriftung und einzelne Elemente (sprich Checkboxen, RadioButtons und Eingabefelder) auf Tabs angelegt --> Daten kommen alle aus XML.
Wenn jetzt noch ein Tab oder ein Eintrag auf einem Tab später dazu kommt, wäre die Umsetzung leicht dynamisch möglich --> indem ich einfach das XML ergänze.
XML wird bei jeden Start des Programms neu ausgewertet und das JTabbedPane mit seinen Unterelementen erzeugt. Umgesetzt habe ich das ganze mit JDOM.

Wenn das Programm gestartet wird, sind alle Eingaben (sprich Checkboxen, Eingabefelder, ... leer und der Nutzer trifft jetzt seine Einstellungen.


Problem:
Mein Problem ist jetzt, wenn der Benutzer auf einen Generieren-Button drückt, muss ich an die Daten der einzelnen Tabs des JTabbedPane aus einer anderen Funktion rankommen. Wie kann ich jetzt auf die einzelnen Elemente (Checkboxen, RadioButtons und Eingabefelder) zugreifen und deren Werte auslesen?

Durch XML wird JTabbedPane  mit allen Unterelementen erzeugt, auf die Daten der Unterelemente soll jetzt in einer anderen Funktion zugegriffen werden.

JTabbedPane  
--> Tab1 --> Panel --> Checkboxen, Radiobuttons, Eingabefelder
--> Tab2 --> Panel --> Checkboxen, Radiobuttons, Eingabefelder
--> ...

Weiss einfach nicht wie ich jetzt in der anderen Funktion an die Daten kommen soll, hab ja keine Klassenweite Deklaration der Checkboxen, Radiobuttons und Eingabefelder.
Geht das irgendwie über Listener zu lösen?

Hoffe mir kann jemand bei dem Problem weiterhelfen.

Gruss Max


----------



## Vincentius (18. Juni 2007)

Hallo Max,

also ganz ohne Listener kannst Du nicht auf Benutzereingaben entsprechend reagieren, das steht schon mal fest. An jedes Eingabe-Element solltest Du einen Listener anhängen und, sobald der Benutzer den Zustand der Komponente verändert (Selektieren einer CheckBox oder Buttons z.B.), musst Du die entsprechende Methode aufrufen, die den aktuellen Zustand in der XML-Datei speichert.

Hier ein kleines Beispiel:

```
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * The Class InputListenerTest.
 */
public class InputListenerTest extends JFrame {

    /**
     * Create a new instance of <code>InputListenerTest</code>.
     */
    public InputListenerTest() {
        super("InputListenerTest");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        final JTabbedPane tabbedPane = new JTabbedPane();
        final Container container = getContentPane();
        container.setLayout(new BorderLayout());
        container.add(tabbedPane, BorderLayout.CENTER);

        final JTextArea debugTextArea = new JTextArea(5, 10);
        debugTextArea.setEditable(false);
        container.add(new JScrollPane(debugTextArea), BorderLayout.SOUTH);

        final JPanel tab1 = new JPanel();
        tabbedPane.addTab("Tab 1", tab1);
        final JCheckBox checkBox1 = new JCheckBox("check 1");
        tab1.add(checkBox1);
        checkBox1.addActionListener(new ActionListener() {
            /** {@inheritDoc} */
            public void actionPerformed(ActionEvent e) {
                debugTextArea.append("'check 1' state changed --> "
                        + checkBox1.isSelected() + "\n");
                // rufe hier Deine Methode auf, die den aktuiellen Zustand in XML speichert... Z.B.:
                // toXML("check 1", checkBox1.isSelected());
            }
        });
        final JRadioButton radioButton1 = new JRadioButton("radio 1");
        tab1.add(radioButton1);
        radioButton1.addActionListener(new ActionListener() {
            /** {@inheritDoc} */
            public void actionPerformed(ActionEvent e) {
                debugTextArea.append("'radio 1' state changed --> "
                        + radioButton1.isSelected() + "\n");
                // toXML("radio 1", radioButton1.isSelected());
            }
        });
        final JTextField textField1 = new JTextField(10);
        tab1.add(textField1);
        textField1.addKeyListener(new KeyAdapter() {
            /** {@inheritDoc} */
            public void keyReleased(KeyEvent e) {
                debugTextArea.append("'text 1' state changed --> '"
                        + textField1.getText() + "'\n");
                // toXML("text 1", textField1.getText());
            }
        });
    }

    /**
     * The main method.
     *
     * @param args the arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new InputListenerTest();
        final Dimension frameSize = new Dimension(600, 400);
        frame.setSize(frameSize);
        final Dimension screenSize =
            Toolkit.getDefaultToolkit().getScreenSize();
        final int frameX = (screenSize.width - frameSize.width) / 2;
        final int frameY = (screenSize.height - frameSize.height) / 2;
        frame.setLocation(frameX, frameY);
        frame.setVisible(true);
    }
}
```

Man kann es auch komplizierter machen, in dem man sogenannten "Data Binding" Frameworks benutzt: http://www.google.de/search?hl=de&q=swing+"data+binding".

Grüße
Vincent


----------



## MadMax2581 (19. Juli 2007)

Vielen Dank für deine Hilfe, hat alles ganz gut geklappt. War echt super!

Grüsse 

Max


----------

