JDialog mit zeitverzögerter Text-Ausgabe

J

Java-Freak

Hallo,

ich versuche folgendes umzusetzten und hab über die Suche nichts vergleichbares gefunden:
-----------------------------------------------------------------------------------------------
- Einen JDialog zu erzeugen.
- darin sollen sich zwei Bereiche befinden
- oberer Bereich North - ist Panel 1, erstmals leer da kommt irgend ein Text mal rein
- unterer Bereich South - ist zuerst eine scrollPane, darin befindet sich Panel 2

- innerhalb Panel 2 möchte ich ein jLabel ausgeben
- nach einer Sekunde Zeitverzögerung dann ein weiteres jLabel
- nach einer weiteren Sekunde Zeitverzögerung dann ein weiteres jLabel
- ganz zum Schluß soll dann noch ein weiter Buttton folgen (noch nicht integriert im untenstehendem Code)
-----------------------------------------------------------------------------------------------

Habe unterschiedliche Ansätze probiert und diverse Versuche scheiterten. Bin mir nicht sicher, ob das in einem JDialog überhaupt funktioniert.

Aktuell und untenstehend habe ich im Konstruktoraufruf eine weitere Methode animierteAusgabe() eingefügt. Jetzt wartet er bei der Ausgabe (zeichnen) des jDialog die kompletten Zeitverzögerung ab ( zwei mal den sleep(1000) ) und gibt danach den JDialog komplett fertiggestellt auf dem Bildschirm aus.

Irgendwie ist es ja verständlich, das er erst nach kompletter Abarbeitung des Konstruktors den jDialog zeichnet und da gehört eben auch die zeitverzögerte Ausgabe dazu, ich weiß aber nicht, wie ich es anders integrieren oder umsetzen kann?


Ich bin für alle Anregungen, Versuche oder funktionstüchtige Lösungen dankbar!!

Code:
import javax.swing.JLabel;

public class beispiel extends javax.swing.JDialog {

	private javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
	private javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
	private javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
	private javax.swing.JLabel jLabelText1 = new javax.swing.JLabel();
	private javax.swing.JLabel jLabelText2 = new javax.swing.JLabel();
	private javax.swing.JLabel jLabelText3 = new javax.swing.JLabel();	

	

	public beispiel(java.awt.Frame parent, boolean modal) {
		super(parent, modal);
		initComponents();
		this.setSize(500, 300);
		// Aufruf einer externen Methode für die "animation"
		// dabei wird das Panel 2 neu gezeichnet
		animierteAusgabe();
	}


	private void initComponents() {
		
		setDefaultCloseOperation (javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

		jPanel1.setLayout(null);
		jPanel1.setBackground(new java.awt.Color(255, 255, 255));
		jPanel1.setMinimumSize(new java.awt.Dimension(500, 100));
		jPanel1.setPreferredSize(new java.awt.Dimension(500, 100));
		getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

		
		jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2,javax.swing.BoxLayout.Y_AXIS));
		jPanel2.setMinimumSize(new java.awt.Dimension(500, 300));
		jPanel2.setPreferredSize(new java.awt.Dimension(500, 300));
		jScrollPane1.setViewportView(jPanel2);
		getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
	
		pack();
	}

	
	private void animierteAusgabe(){
		// interner Aufruf der "zeitverzögerten Ausgabe"
		jLabelText1.setText("Startzeile hier");
		jPanel2.add(jLabelText1);
		jPanel2.repaint();
		
		try {Thread.sleep(1000);}
		catch (Exception e) {
		}
		
		jLabelText2.setText("Zweite Zeile: Ausgabe ist Zeitverzögert");
		jPanel2.add(jLabelText2);
		jPanel2.repaint();

		try {Thread.sleep(1000);}
		catch (Exception e) {
		}
		
		jLabelText3.setText("Dritte Zeile: Jetzt ist Schluß");
		jPanel2.add(jLabelText3);
		jPanel2.repaint();
		// Zeitverzögerung Ende

	}
	

	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() { new beispiel(new javax.swing.JFrame(), true).setVisible(true); }
		});
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Hi!
Ich habe mir erlaubt deine Applikation zum laufen zu bringen ;-) ...
(Bin selbst relativ neu in Java und wollte mal sehen ob ichs hinbekomme)

Hier zuerst mal deine Applikation ...
Java:
import javax.swing.JLabel;

public class beispiel extends javax.swing.JDialog {

	private javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
	private javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
	private static javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
	private static javax.swing.JLabel jLabelText1 = new javax.swing.JLabel();
	private static javax.swing.JLabel jLabelText2 = new javax.swing.JLabel();
	private static javax.swing.JLabel jLabelText3 = new javax.swing.JLabel();	

	

	public beispiel(java.awt.Frame parent, boolean modal) {
		super(parent, modal);
		initComponents();
		this.setSize(500, 300);
		// Aufruf einer externen Methode für die "animation"
		// dabei wird das Panel 2 neu gezeichnet
		//animierteAusgabe();
	}


	private void initComponents() {
		
		setDefaultCloseOperation (javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

		jPanel1.setLayout(null);
		jPanel1.setBackground(new java.awt.Color(255, 255, 255));
		jPanel1.setMinimumSize(new java.awt.Dimension(500, 100));
		jPanel1.setPreferredSize(new java.awt.Dimension(500, 100));
		getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

		
		jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2,javax.swing.BoxLayout.Y_AXIS));
		jPanel2.setMinimumSize(new java.awt.Dimension(500, 300));
		jPanel2.setPreferredSize(new java.awt.Dimension(500, 300));
		jScrollPane1.setViewportView(jPanel2);
		getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
	
		pack();
	}

	
	public static void animierteAusgabe(){
		// interner Aufruf der "zeitverzögerten Ausgabe"
		jLabelText1.setText("Startzeile hier");
		jPanel2.add(jLabelText1);
		
		
		try {Thread.sleep(1000);}
		catch (Exception e) {
		}
		
		jLabelText2.setText("Zweite Zeile: Ausgabe ist Zeitverzögert");
		jPanel2.add(jLabelText2);
		jPanel2.revalidate();
		

		try {Thread.sleep(1000);}
		catch (Exception e) {
		}
		
		jLabelText3.setText("Dritte Zeile: Jetzt ist Schluß");
		jPanel2.add(jLabelText3);
		jPanel2.revalidate();
		
		// Zeitverzögerung Ende

	}
	

	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() { new beispiel(new javax.swing.JFrame(), true).setVisible(true); }
		});
		animierteAusgabe();
	}

}

Also dein Fehler lag ganz einfach darin, dass du die Methode animierteAusgabe() bereits im Konstruktor aufgerufen hast.
Somit wurde die Zeitverzögerung bereits beim Aufbau der GUI ausgeführt.
Ich habe den Aufruf in die Main gepackt, dann noch eine statische Methode daraus gemacht. Außerdem habe ich den Aufruf repaint() durch revalidate() ersetzt ... schon gings ...

War gar nicht so wild ;-)
 
Besten Dank!

Werds gleich mal umsetzten und noch ein paar Verschlimmbesserungen probieren einzubauen.
 
Zurück