Ein TextFeld als mit Echtzeitausgabe? (Wie bei der Console)

Status
Nicht offen für weitere Antworten.

alphaChill

Aktives Mitglied
Moin an alle,

ich programmiere derzeit mit Java-Eclipse (3.1) ein kleines Programm für Sportübungen. Auf der Console läuft das Programm auch ohne Probleme. Nur wenn ich das ganze in ein Programm mit Oberfläche packen möchte, wird der erzeugte Text erst nachdem das Programm fertig ist auf die "JTextArea" ausgegeben. Ich hätte aber jetzt ganz gern, dass wenn ich z.B. dies Schleife hier habe:

Code:
          for (int i = 10; i > 0; i--) {

            anzeigefenster.append(String.valueOf(i) + "\n");

            Console.println(i);
            try {
              Thread.sleep(1000);
            }
            catch (InterruptedException e2) {

              e2.toString();
            }
          }

auch nach jeder Sekunde eine Ziffer ausgeben wird und nicht nach 10 Sekunden auf einen Schlaf alle Zahlen. Kann mir jemand 'n Tipp geben, mit welchen Pane bzw. mit welcher Methode ich das am besten mache? Hier der restliche Programmcode:

Code:
package b;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

import support.Console;

public class Test extends JFrame {

  private JPanel      jContentPane   = null;
  private JLabel      statusLabel    = null;
  private JPanel      Panelcenter    = null;
  private JButton     btnbeenden     = null;
  private JButton     btnokay        = null;
  private JScrollPane jScrollPane    = null;
  private JTextArea   anzeigefenster = null;

  /**
   * This method initializes Panelcenter
   * 
   * @return javax.swing.JPanel
   */
  private JPanel getPanelcenter() {
    if (Panelcenter == null) {
      Panelcenter = new JPanel();
      Panelcenter.setLayout(null);
      Panelcenter.add(getBtnbeenden(), null);
      Panelcenter.add(getBtnokay(), null);
      Panelcenter.add(getJScrollPane(), null);
    }
    return Panelcenter;
  }

  /**
   * This method initializes btnbeenden
   * 
   * @return javax.swing.JButton
   */
  private JButton getBtnbeenden() {
    if (btnbeenden == null) {
      btnbeenden = new JButton();
      btnbeenden.setBounds(new java.awt.Rectangle(30, 382, 92, 24));
      btnbeenden.setText("Beenden");
      btnbeenden.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          System.exit(0);
        }
      });
    }
    return btnbeenden;
  }

  /**
   * This method initializes btnokay
   * 
   * @return javax.swing.JButton
   */
  private JButton getBtnokay() {
    if (btnokay == null) {
      btnokay = new JButton();
      btnokay.setLocation(new java.awt.Point(158, 382));
      btnokay.setText("Start");
      btnokay.setSize(new java.awt.Dimension(92, 24));
      btnokay.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {

          for (int i = 10; i > 0; i--) {

            anzeigefenster.append(String.valueOf(i) + "\n");

            Console.println(i);
            try {
              Thread.sleep(1000);
            }
            catch (InterruptedException e2) {

              System.out.println(e2.getMessage());
            }
          }

        }
      });
    }
    return btnokay;
  }

  /**
   * This method initializes jScrollPane
   * 
   * @return javax.swing.JScrollPane
   */
  private JScrollPane getJScrollPane() {
    if (jScrollPane == null) {
      jScrollPane = new JScrollPane();
      jScrollPane.setBounds(new java.awt.Rectangle(18, 12, 266, 357));
      jScrollPane.setViewportView(getAnzeigefenster());
    }
    return jScrollPane;
  }

  /**
   * This method initializes anzeigefenster
   * 
   * @return javax.swing.JTextArea
   */
  private JTextArea getAnzeigefenster() {
    if (anzeigefenster == null) {
      anzeigefenster = new JTextArea();
    }
    return anzeigefenster;
  }

  /**
   * @param args
   */
  public static void main(String[] args) {
    Test t1 = new Test();

  }

  /**
   * This is the default constructor
   */
  public Test() {
    super();
    initialize();
  }

  /**
   * This method initializes this
   * 
   * @return void
   */
  private void initialize() {
    this.setSize(320, 480);
    this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    this.setContentPane(getJContentPane());
    this.setTitle("Zeitplaner");
    this.setVisible(true);
  }

  /**
   * This method initializes jContentPane
   * 
   * @return javax.swing.JPanel
   */
  private JPanel getJContentPane() {
    if (jContentPane == null) {
      statusLabel = new JLabel();
      statusLabel.setText("(c) 2007, Thomas Jäger");
      statusLabel
                 .setBorder(javax.swing.BorderFactory
                                                     .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
      statusLabel
                 .setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
      jContentPane = new JPanel();
      jContentPane.setLayout(new BorderLayout());
      jContentPane.add(statusLabel, java.awt.BorderLayout.SOUTH);
      jContentPane.add(getPanelcenter(), java.awt.BorderLayout.CENTER);
    }
    return jContentPane;
  }

} // @jve:decl-index=0:visual-constraint="154,34"

Gruß alphaChill


[Edit] Habe eben das Programm mal nach dieser Anleitung (http://www.uni-koeln.de/rrzk/kurse/unterlagen/java/allg/eclipse/JarExport.html) exportiert und raus kam das hier:
http://main.ma.funpic.de/ebayupload/sport.jar
Das Programm lässt sich immerhin schon mal öffnen und schließen, aber wenn ich auf "Start" klicke sehe ich eine "10" und das war's ... warum wird die Schleife nicht ausgeführt? Ich versteht's nicht... 🙁
 
Lesson: Concurrency in Swing und Lesson: Concurrency

Auf die Schnelle z.B.:
Code:
  private JButton getBtnokay() {
      if (btnokay == null) {
          btnokay = new JButton();
          btnokay.setLocation(new java.awt.Point(158, 382));
          btnokay.setText("Start");
          btnokay.setSize(new java.awt.Dimension(92, 24));
          btnokay.addActionListener(new java.awt.event.ActionListener(){
              public void actionPerformed(java.awt.event.ActionEvent e) {
                  
                  Thread thread = new Thread(){
                      public void run() {
                          for (int i = 10; i > 0; i--) {
                              
                              anzeigefenster.append(String.valueOf(i) + "\n");
                              
                              System.out.println(i);
                              try {
                                  Thread.sleep(1000);
                              } catch (InterruptedException e2) {
                                  
                                  System.out.println(e2.getMessage());
                              }
                          }
                      }
                  };
                  thread.start();                                                                    
                  
              }
          });
      }
    return btnokay; 
  }

Dein JAR gibt wahrscheinlich nur 10 aus, weil das Package support.Console nicht eingebunden ist und deswegen eine Exception auftritt. Wahrscheinlich brauchst Du das Package auch nicht, wenn Du mit System.out arbeitest.
 
Also, dass er nur die 10 ausgegeben hat, lag an dem Console.println... danke... und dass er alles auf einen Schlag ausgegeben hat, lag daran, dass ich das ganze nicht im Hintergrund hab laufen lassen. Also hab ich nun eine Thread-Methode genommen und schon hat alles geklappt 🙂

Anleitung hab ich hierher:

www.cs.helsinki.fi/u/vihavain/k03/Java/JavathreadsandGUI.html


Und der komplette Programmcode, der in der Methode "actionPerformed" für den Button steht sieht wie folgt aus:



Code:
new Thread () {
            public void run () {


              anzeigefenster.append("Start in:"+"\n");
              System.out.println("Start in:");

              
              for (int i = 10; i > 0; i--) {     
                try {
                  Thread.sleep(1000);
                }
                catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                }
                anzeigefenster.append(String.valueOf(i+"\n"));
                System.out.println(i);

              }
         
              
              

            }}.start ();
 
zugriffe auf awt/swing-komponenten darf man nur aus dem awt-eventhread machen - in deinem link wird invokeLater/invokeAndWait oft genug genannt, schau dir die mal an
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben