tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Fabio Hellmann
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
562
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    angelikamorgan angelikamorgan ist offline Mitglied Silber
    Registriert seit
    Sep 2003
    Beiträge
    89
    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

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    
    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();
        }
        
    }
    Geändert von angelikamorgan (07.01.12 um 10:11 Uhr)
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    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.
    Code java:
    1
    2
    3
    
        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
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    angelikamorgan angelikamorgan ist offline Mitglied Silber
    Registriert seit
    Sep 2003
    Beiträge
    89
    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
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Das geht schon, allerdings ist diese Lösung nicht sonderlich schön. Ich habe es jetzt mal mit einer Rekursion gelöst.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
        @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.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
        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.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    
       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
    angelikamorgan bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    angelikamorgan angelikamorgan ist offline Mitglied Silber
    Registriert seit
    Sep 2003
    Beiträge
    89
    Hallo Fabio,

    vielen Dank für deine unterstützung!
    Ich werde mich an deinem Ratschlag halten

    Grüße,
    Angelika
     

  6. #6
    angelikamorgan angelikamorgan ist offline Mitglied Silber
    Registriert seit
    Sep 2003
    Beiträge
    89
    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


    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    
    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(); 
        }
     
    }
     

  7. #7
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
        // 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
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  8. #8
    angelikamorgan angelikamorgan ist offline Mitglied Silber
    Registriert seit
    Sep 2003
    Beiträge
    89
    Oje, das hätte ich aber auch selber lösen müssen
    Danke Fabio!
     

Ähnliche Themen

  1. Selektion eines nicht belegten Wertes innerhalb eines Bereiches (Oracle 10g)
    Von TimoTH im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 06.10.10, 16:42
  2. <div> nicht innerhalb eines <div> im FF
    Von Arndtinho im Forum CSS
    Antworten: 16
    Letzter Beitrag: 20.11.07, 18:53
  3. JTabbedPanes schachteln?!
    Von Ravebaby im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 07.12.06, 17:05
  4. Variable innerhalb Formular (Textarea)
    Von Wet-Blanket im Forum PHP
    Antworten: 3
    Letzter Beitrag: 23.07.05, 01:17
  5. Antworten: 3
    Letzter Beitrag: 14.03.03, 16:33