Java for-Schleife in GUI TextArea

Die Frage ist wirklich einfach .... Ich habe eine for-Schleife, um eine Liste der Titel auszudrucken und die Ergebnisse an die TextArea der GUI anzuhängen. Beispielsweise enthält die Liste die Titel A, B, C. Jedes Mal, wenn die TextArea die Titel nacheinander anzeigen soll. In meinem Fall zeigt der Ausdruck jedoch immer die gesamte Titelliste. Meine TextArea-Methode wird in der for-Schleife aufgerufen. es sollte der Ausdruck für jede Schleife, aber nicht die gesamte Liste angehängt werden. wie man es löst bitte helfen ...

Entschuldigung für die Verwirrung ... Ich verwende JTextArea, um die Ergebnisse anzuzeigen. Hier ist der Code:

    private static JTextArea textArea1;
 ....
 ....
    textArea1 = new JTextArea(26, 38);
    textArea1.setLineWrap(true);
    textArea1.setEditable(false);
    sbrText = new JScrollPane(textArea1);
    sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
....
....

public static void getStringText() {

    String ptime = passdata.getTime();
    String ppid = passdata.getPageid();
    String ptitle = passdata.getTitle();
    String previd = passdata.getrevid();
    String pparentid = passdata.getParentId();
    String puser = passdata.getUser();
    String pcomments = passdata.getComments();

    textArea1.append("Timestamp: " + ptime + "\n" + "Pageid: " + ppid
            + "\n" + "Title:" + ptitle + "\n" + "Revid:" + previd + "\n"
            + "Parentid:" + pparentid + "\n" + "User:" + puser + "\n"
            + "Comments:" + pcomments + "\n" + newline + newline);
    textArea1.setCaretPosition(textArea1.getDocument().getLength());
    // System.out.println(passToText.getPageid());
}

Die Methode getStringText () wird in einer for-Schleife aufgerufen.

Hier ist die GUI, die ich gebaut habe. es zeigt den Titel mit seinen Informationen, kann nicht einzeln gedruckt werden, in der for-Schleife sollte es wie A gedruckt werden und dann wie B. Die Animation auf der GUI sollte wie A und dann wie B angezeigt werden. Aber in meinem Fall , es zeigt A, B, C zur gleichen Zeit ... Sorry Es ist schwer zu erklären, was ich sehe ...

 kiheru20. Aug. 2013, 11:59
Zeigen Sie den Code für Ihren Versuch an, und möglicherweise kann jemand helfen.
 Link1920. Aug. 2013, 11:58
Das ergibt keinen Sinn. Welche GUI verwenden Sie, welche Textkomponente? Kannst du ein bisschen Code oder ein paar Screenshots posten? Wollen Sie, dass sie sich in separaten Zeilen befinden, oder möchten Sie eine Art Animation sehen?
 Rakesh20. Aug. 2013, 11:59
eine nach der anderen oder eine ganze Liste nach der anderen, welchen Unterschied macht es?

Antworten auf die Frage(1)

Lösung für das Problem

als würden Sie sich im Kontext des Event-Dispatching-Threads bewegen.

Das heißt, bis Sie die Schleife (und die Methode) verlassen, wird der Inhalt derJTextArea wird nicht auf dem Bildschirm aktualisiert

Swing ist eine Single-Threaded-Umgebung. Der Event Dispatching Thread ist unter anderem für die Bearbeitung von Malanfragen zuständig. Alles, was diesen Thread blockiert, hindert ihn daran, Malaktualisierungen zu verarbeiten.

Es ist auch erforderlich, dass alle Aktualisierungen und Interaktionen, die Sie an der Benutzeroberfläche vornehmen, im Kontext des EDT erfolgen ...

Sie haben ein paar Möglichkeiten ...

Sie könnten eine verwendenjavax.swing.Timer, mit dem einActionEvent regelmäßig, was im Rahmen des EDT ausgelöst wird. Dies bedeutet, dass, während der Timer "wartet", der EDT nicht blockiert wird ...

Sie könnten eine verwendenSwingWorker, mit dem Sie die Verarbeitung in einem Hintergrundthread ausführen können, aber die Möglichkeit dazu habenpublish Ergebnisse zurück an die EDT undprocess Diese Updates innerhalb des EDT ...

AuscheckenParallelität in Swing für mehr Details

Aktualisiert mit Beispiel

javax.swing.Timer fungiert als eine Art Schleife (allesamt eine unkontrollierte Schleife). Jede Periode wird ausgelöst. Sie müssen so behandeln, als hätten Sie gerade eine weitere Iteration wiederholt, und den Status der Benutzeroberfläche nach Bedarf aktualisieren ...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TextTimer {

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

    public TextTimer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static final String[] TEXT = new String[]{
        "Why, you wanna tell me how to live my life?",
        "Who, are you to tell me if it's black or white?",
        "Mama, can you hear me? Try to understand.",
        "Is innocence the difference between a boy and a man?",
        "My daddy lived the lie, that's just the price that he paid",
        "Sacrificed his life, just slavin' away.",
        "",
        "Ohhh, if there's one thing I hang onto,",
        "That gets me through the night.",
        "I ain't gonna do what I don't want to,",
        "I'm gonna live my life.",
        "Shining like a diamond, rolling with the dice,",
        "Standing on the ledge, I show the wind how to fly.",
        "When the world gets in my face,",
        "I say, Have A Nice Day.",
        "Have A Nice Day",
        "",
        "Take a look around you; nothing's what it seems",
        "We're living in the broken home of hopes and dreams,",
        "Let me be the first to shake a helping hand.",
        "Anybody brave enough to take a stand,",
        "I've knocked on every door, on every dead end street,",
        "Looking for forgiveness,",
        "what's left to believe?",
        "",
        "Ohhh, if there's one thing I hang onto,",
        "That gets me through the night.",
        "I ain't gonna do what I don't want to,",
        "I'm gonna live my life.",
        "Shining like a diamond, rolling with the dice,",
        "Standing on the ledge, I show the wind how to fly.",
        "When the world gets in my face,",
        "I say, Have A Nice Day.",
        "Have A Nice Day.",
        "",
        "[Guitar Solo]",
        "",
        "Ohhh, if there's one thing I hang onto,",
        "That gets me through the night.",
        "I ain't gonna do what I don't want to,",
        "I'm gonna live my life.",
        "Shining like a diamond, rolling with the dice,",
        "Standing on the ledge, I show the wind how to fly.",
        "When the world gets in my face,",
        "I say, Have A Nice Day.",
        "Have A Nice Day.",
        "Have A Nice Day.",
        "Have A Nice Day.",
        "Have A Nice Day.",
        "",
        "When The world keeps trying, to drag me down,",
        "I gotta raise my hands, I'm gonna stand my ground.",
        "Well I say, Have A Nice Day.",
        "Have A Nice Day",
        "Have A Nice Day"
    };

    public class TestPane extends JPanel {

        private JTextArea ta;
        private int currentLine = 0;

        public TestPane() {

            setLayout(new BorderLayout());
            ta = new JTextArea(20, 40);
            add(new JScrollPane(ta));

            Timer timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String text = TEXT[currentLine];
                    ta.append(text + "\n");
                    ta.setCaretPosition(ta.getText().length());
                    currentLine++;
                    if (currentLine >= TEXT.length) {
                        ((Timer)e.getSource()).stop();
                    }
                }
            });
            timer.start();            
        }        
    }
}
 wadefanyaoxia20. Aug. 2013, 22:40
Immer noch verwirrend ... zum Beispiel habe ich: timer = new Timer (5000, new ActionListener () {public void actionPerformed (ActionEvent e) {für (int i = 0; i <10; i ++) {textArea1.append (i +) "\ n"); textArea1.setCaretPosition (textArea1.getDocument (). getLength ());}}}); ... ... timer.start (); Es werden 0 bis 9 angehängt, nicht einer nach dem anderen ... wie löst man das ??
 MadProgrammer20. Aug. 2013, 23:33
Nein. Bei jedem Häkchen müssen Sie den Textbereich nur mit dem NÄCHSTEN Datenelement aktualisieren, bis Ihnen die Daten ausgehen. DasTimer fungiert als eine Art Schleife
 wadefanyaoxia20. Aug. 2013, 16:46
Hallo, ich habe den Timer ausprobiert, weiß aber nicht, wie er funktioniert ... es scheint, als würde die Aktion verzögert ...
 MadProgrammer20. Aug. 2013, 22:02
Stimmt. Das Indra wäre, dass Sie bei jedem Aufruf der actionPerformed-Methode Ihren Textbereich mit neuem Inhalt aktualisieren würden, bis Sie fertig waren. Sobald Sie alle Inhalte hinzugefügt haben, stoppen Sie den Timer
 MadProgrammer20. Aug. 2013, 23:44
Ich habe ein funktionierendes Beispiel hinzugefügt

Ihre Antwort auf die Frage