Textarea innerhalb eines JTabbedPanes auszulesen

Hallo Zusammen,

ich schaffe es nicht, ein Textarea innerhalb eines JTabbedPanes auszulesen.
Anbei füge ich ein kleines Beispiel bei, um mein Problem zu verdeutlichen.
Bin für jede Hilde dankbar!

Grüße,
Angelika

Java:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

public class JTabbedPaneTest implements ActionListener {
	
	private JButton button;
	private JTabbedPane tabbedPane;
	
	public JTabbedPaneTest() {
		JPanel panelMain = new JPanel();
		panelMain.add(getPanel());		
		JFrame frame = new JFrame();
		frame.setTitle("Titel");
		frame.add(panelMain);
		frame.setLocationRelativeTo(null);
		frame.setSize(frame.getPreferredSize());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);	
		frame.pack();
	}
	
	public JPanel getPanel() {
		
		JPanel panel = new JPanel();
		
		// tab
		tabbedPane = new JTabbedPane();
		tabbedPane.insertTab("Reiter", null, getTab(""), null, 0); // index 0
		panel.add(tabbedPane);
		
		// button
		button = new JButton("Text lesen!");
		button.addActionListener(this);
		panel.add(button);
		
		return panel;
	}
	
    public JComponent getTab(String text) {
        JPanel panel = new JPanel();
        JTextArea textArea = new JTextArea("Dieser Text soll ausgelesen werden, sobald der Knopf gedrueckt wurde!", 2,2);
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(500, 100));
        panel.add(scrollPane);
        return panel;
    }

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals(button.getText())) {
			
			// Wie kann ich mein TextArea auslesen?!
			// TODO			
			
			// Kaese!
//			Component comp = tabbedPane.getComponent(0);
//			System.out.println(comp.getName()); // Ausgabe null
			
//			Component comp = tabbedPane.getComponentAt(0);
//			System.out.println(comp.getName()); // Ausgabe null		
			
//			Component[] components = tabbedPane.getComponents();
//			System.out.println(components[0].getName()); // Ausgabe null
			
			int counter = tabbedPane.getComponentCount();
			System.out.println(counter); // Ausgabe 1!
		}		
	}
	
    public static void main(String[] args) {
		new JTabbedPaneTest();
	}
	
}
 
Zuletzt bearbeitet:

Fabio Hellmann

Erfahrenes Mitglied
Hallo Angelika,
um für dein Problem eine einfache Lösung vorschlagen zu dürfen, würde ich dir empfehlen, das JTextArea genau wie das JTabbedPane als eine Variable aus der Methode aus zu lagern. Dadurch kannst du dir viel Arbeit ersparen.
Java:
    private JButton button;
    private JTabbedPane tabbedPane;
    private JTextArea textArea;

ps.: Bitte verwende die Java-Code Tags. Ein Beispiel findest du in meiner Signatur.

Gruß

Fabio
 
Hallo Fabio,

danke für die schnelle Antwort.
Der obige Ausschnitt von mir ist nur ein Beispiel und zeigt die Struktur der Anwendung.
Ich habe in meine "richtige" Anwendung ein "Add Button" implementiert, um weitere Reiter einzufügen.
Deine Lösung wird nicht funktionieren, da ich jedesmal die Variable "textArea" überschreiben werde.
Ich hatte auch schon mit dem Gedanken gespielt, ein Array mitlaufen zu lassen, aber die Lösung wäre nicht besonders "schön".
Muss irgendwie möglich bestehen, an die Reiter ran zu kommen :(

Grüße,
Angelika
 

Fabio Hellmann

Erfahrenes Mitglied
Das geht schon, allerdings ist diese Lösung nicht sonderlich schön. Ich habe es jetzt mal mit einer Rekursion gelöst.
Java:
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals(button.getText())) {
			Component[] components = tabbedPane.getComponents();
			for (int i = 0; i < components.length; i++) {
				JComponent tabComponent = (JComponent) components[i];
				JTextArea textArea = (JTextArea) recursiveComponentSearch(tabComponent, JTextArea.class);
				System.out.println(textArea.getText());
			}
		}       
	}
	
	private JComponent recursiveComponentSearch(JComponent comp, Class<?> searched) {
		Component[] components = comp.getComponents();
		for (int i = 0; i < components.length; i++) {
			JComponent c = (JComponent) components[i];
			if(searched.isInstance(c)) {
				return c;
			} else if(c.getComponents().length > 0) {
				return recursiveComponentSearch(c, searched);
			}
		}
		return null;
	}

Ich würde dir allerdings drotzdem empfehlen deinen Inhalt für die jeweiligen Tabs auszulagern.
Java:
	private final class MyTab extends JPanel
	{
		private final JTextArea textArea;
		
		public MyTab() {
			textArea = new JTextArea("Dieser Text soll ausgelesen werden, sobald der Knopf gedrueckt wurde!", 2,2);
			JScrollPane scrollPane = new JScrollPane(textArea);
			scrollPane.setPreferredSize(new Dimension(500, 100));
			add(scrollPane);
		}
		
		public String getText() {
			return textArea.getText();
		}
	}
Dann erzeugst du dir einfach x-mal eine Instanz dieser Klasse (Tabs) und speicherst dir diese dann in einer List. So kannst du dann ganz einfach auf deine Texte zugreifen.
Java:
   private final List<MyTab> tabList = new ArrayList<MyTab>();

   public void eineMethode() {
      MyTab tab = tabList.get(0);
      String text = tab.getText();
      System.out.println(text);
   }

Aber das ist letztenendes immer noch deine Entscheidung.

Gruß

Fabio
 
Hallo Fabio,

mich plagt noch eine Hürde. Eventuell kannst du auch diese Frage beantworten.

Ich habe das obige Beispiel mit der Rekursion übernommen.
Innerhalb der Anwendung werden zwei Reiter erstellt. Jeder Reite beinhaltet ein TextArea. Mit deinem Beispiel kann ich die TextAreas der beiden Reiter nacheinander auslesen.
Was mir NICHT gelingt, ist im gleichen Atemzug die Titel der Reiter mit auszulesen.

Wenn du die Anwendung ausführst, erhältst du die Meldung:

text: Text 1
text: Text 2

Ich Möchte, folgende Ausgabe erhalten:

Reiter 1: Text 1
Reiter 2: Text 2

Ich bedanke mich im Vorraus,
Angelika


Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

public class MyTabbedPaneTest  implements ActionListener {
	
	protected static JFrame frame;
	protected static JTabbedPane tabbedPane;
	private JButton button;
	private JTextArea textArea;
	
	public MyTabbedPaneTest() {
		
		button = new JButton("Alle Reiter und deren Inhalte auslesen!");
		button.addActionListener(this);
		
		tabbedPane = new JTabbedPane();
		createNewTab("Reiter 1", "Text 1");
		createNewTab("Reiter 2", "Text 2");
		
		frame = new JFrame();
		
		
		JPanel mainPanel = new JPanel();
		mainPanel.add(tabbedPane);
		mainPanel.add(button);
		frame.add(mainPanel);
		
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.pack();
	}
 
    public void createNewTab(String title, String text) {
    	
		// inhalt
		final JPanel tab_content = new JPanel();
		textArea = new JTextArea(text, 1, 1);
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setPreferredSize(new Dimension(350, 200));
		tab_content.add(scrollPane);
		
		// reiter
		JPanel myTabPanel = new JPanel();
		JLabel myLabel = new JLabel(title);
		myTabPanel.add(myLabel, BorderLayout.WEST);
		myTabPanel.add(new JButton("button"), BorderLayout.EAST);
		
		tabbedPane.addTab(null, tab_content);
		tabbedPane.setTabComponentAt(tabbedPane.getTabCount() - 1, myTabPanel);
    }
	
	// Rekursion
	private JComponent recursiveComponentSearch(JComponent comp, Class<?> searched) {
		Component[] components = comp.getComponents();
		for (int i=0; i<components.length; i++) {
			JComponent com = (JComponent) components[i];
			if (searched.isInstance(com)) {
				return com;
			} else if (com.getComponents().length > 0) {
				return recursiveComponentSearch(com, searched);
			}
		}
		return null;
	}
	
	// Reiter Titel und das entsprechende TextAre Inhalt (text) Auslesen
    @Override
    public void actionPerformed(ActionEvent e) {
    	if (e.getActionCommand().equals(button.getText())) {    		
    		Component[] components = tabbedPane.getComponents();
			for (int i=0; i<components.length; i++) {
				JComponent tabComponent = (JComponent) components[i];
								
				// Rekursion
				JTextArea textArea = (JTextArea) recursiveComponentSearch(tabComponent, JTextArea.class);
				if (textArea!=null) {
					
//					System.out.println(tabComponent.getName()); // liefert null!!
//					System.out.println(tabComponent.getComponent(0).getParent());
					
					// Hier möchte ich gerne den Titel des Reiters auslesen
		    		System.out.println("text: "+textArea.getText());
				}
			}
			
		}
    }

	public static void main(String[] args) {
		new MyTabbedPaneTest();	
	}

}
 

Fabio Hellmann

Erfahrenes Mitglied
Hallo Angelika,
die Lösung für dein Problem ist recht schnell zu finden. Den Namen deiner Reiter speicherst du in JLabels ab. Diese JLabels liegen in einem JPanel als Componente auf dem Tab (Tabreiter). Sprich, du holst dir über dein JTabbedPane den jeweiligen Reiter-Inhalt (JComponent) gehst wieder rekursive drüber und schon erhälst du dein gewünschtes Ergebnis. :)

In Code würde das dann so aussehen:
Java:
    // Reiter Titel und das entsprechende TextAre Inhalt (text) Auslesen
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals(button.getText())) {         
            int currentTab = 0;
            Component[] components = tabbedPane.getComponents();
            for (int i=0; i<components.length; i++) {
                JComponent tabComponent = (JComponent) components[i];
                                
                // Rekursion
                JTextArea textArea = (JTextArea) recursiveComponentSearch(tabComponent, JTextArea.class);
                if (textArea!=null) {
                    // Hier möchte ich gerne den Titel des Reiters auslesen
                	JComponent component = (JComponent) tabbedPane.getTabComponentAt(currentTab++);
                	JLabel label = (JLabel) recursiveComponentSearch(component, JLabel.class);
                    System.out.println(label.getText()+": "+textArea.getText());
                }
            }
        }
    }

Gruß

Fabio