Frame zeigt keine Komponenten

Underfaker

Bekanntes Mitglied
Hallo zusammen,

kann mir jemand erklären warum in folgendem Code erst nach Beendigung der for-Schleife etwas angezeigt wird? Ich kann das Problem leider nicht lösen.
Java:
import java.awt.EventQueue;


public class WaitForGeneration {

	private JFrame frame_WaitForGeneration;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					WaitForGeneration window = new WaitForGeneration();
					window.frame_WaitForGeneration.setVisible(true);
					for (int i = 0; i < 1000000; i++)
						System.out.println("bla");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public WaitForGeneration() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame_WaitForGeneration = new JFrame();
		frame_WaitForGeneration.setType(Type.UTILITY);
		frame_WaitForGeneration.getContentPane().setBackground(Color.WHITE);
		frame_WaitForGeneration.setTitle("Prozess in Arbeit");
		frame_WaitForGeneration.setBounds(100, 100, 612, 97);
		frame_WaitForGeneration.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame_WaitForGeneration.getContentPane().setLayout(null);
		
		JLabel lblDieAufgabenstellungWird = new JLabel("Die Aufgabenstellung wird generiert, dies kann einige Zeit in Anspruch nehmen...");
		lblDieAufgabenstellungWird.setFont(new Font("Tahoma", Font.PLAIN, 13));
		lblDieAufgabenstellungWird.setBounds(79, 11, 507, 40);
		frame_WaitForGeneration.getContentPane().add(lblDieAufgabenstellungWird);
		
		/*JLabel label = new JLabel(new ImageIcon(ClassLoader.getSystemClassLoader().getResource("icons/Wait.png")));
		label.setBounds(10, 11, 64, 41);
		frame_WaitForGeneration.getContentPane().add(label);*/
	}
}

Vielen Dank im Voraus
 

anti-held

Bekanntes Mitglied
Die GUI-Änderungen werden erst von der EventQueue gemacht.
Diese startet erst, wenn der derzeitige Thread beendet ist.
Da dein Thread noch warten muss, bis die Schleife beendet ist, dauert es auch, bis die Änderungen dargestellt werden.
Das bedeutet: du musst deine GUI-Erstellung oder deine Schleife in einen seperaten Thread werfen.

z.B.

Java:
new Thread(){
                    WaitForGeneration window = new WaitForGeneration();
                    window.frame_WaitForGeneration.setVisible(true);
}.start();

oder (die bessere Lösung) du scheibst die Schleife einfach aus deinem invokeLater raus.
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Hm ok danke aber dann hilft mir das doch nicht.

In unserem Programm versuche ich ein fenster zu öffnen dass die ganze Zeit angezeigt wird während etwas läuft (wie der Text schon zeigte soll eine Aufgabe generiert werden).

Dafür wollte ich folgende Methode aufrufen wenn ein Button gedrückt wird:
Java:
	private void openWaitForGenerationWindow()
	{
		frame_WaitForGeneration = new JDialog(frame, "", true);
		frame_WaitForGeneration.getContentPane().setBackground(Color.WHITE);
		frame_WaitForGeneration.setTitle("Prozess in Arbeit");
		frame_WaitForGeneration.setType(Type.UTILITY);
		frame_WaitForGeneration.setBounds(100, 100, 612, 97);
		frame_WaitForGeneration.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		frame_WaitForGeneration.getContentPane().setLayout(null);
		JLabel waitForGeneration_Caption = new JLabel("Die Aufgabenstellung wird generiert, dies kann einige Zeit in Anspruch nehmen...");
		waitForGeneration_Caption.setFont(new Font("Tahoma", Font.PLAIN, 13));
		waitForGeneration_Caption.setBounds(79, 11, 507, 40);
		frame_WaitForGeneration.getContentPane().add(waitForGeneration_Caption);
		JLabel lbl_WaitForGeneration_Icon = new JLabel(new ImageIcon(ClassLoader.getSystemClassLoader().getResource("icons/Wait.png")));
		lbl_WaitForGeneration_Icon.setBounds(10, 11, 64, 41);
		frame_WaitForGeneration.getContentPane().add(lbl_WaitForGeneration_Icon);
	}

Es sieht also so aus:
Java:
openWaitForGenerationWindow();
generate();
frame_WaitForGeneration.dispose();

(Ich kann leider nicht den gesamten Code hier posten)
Hast du eine Idee wie ich das lösen kann?

ps: Mir fällt grad auf das das obige meine ursprüngliche Idee war, damit der User nicht das ursprüngliche Fenster anklickt, deshalb ist modal true gesetzt, leider arbeitet das Programm gfarnicht weiter bis das Fenster geschlossen wird.

Ich weiß also im Moment nicht wie ich dieses fenster während dem prozess immer im Vordergrund anzeigen kann.
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Dein Code sollte ungefähr funktionieren wie der hier kurz zusammengeschusterte:

Java:
public class WaitDialog extends JFrame {

	private static WaitDialog dialog;
	
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// erstelle Wait Fenster
		EventQueue.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				dialog = new WaitDialog();
				dialog.setVisible(true);
			}
		});
		
		// Tu etwas
		Thread.currentThread().sleep(5000);
		
		// schließe Fenster
		dialog.dispose();
	}
	
	public WaitDialog(){
		super("WaitDialog");
		setLocationByPlatform(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(200,200);
		add(new JLabel("bitte warten."));
	}

}

Als "Berechnung" wird hier nur 5sec gewartet.
 

Underfaker

Bekanntes Mitglied
Ja ok das bekomm ich auch alleine hin, weil es ist dasselbe Fenster.

Ich habe:
main: Öffnet Frame mit kompletten Programm
In dem programm wird Button gedrückt:
-> Zeige JDialog, wie im vorherigen Post (immer im Vordergrund)
-> Mach irgendwas
-> Wenn fertig schließe JDialog
-> fahre fort mit altem Programm

Und dort müsste ich es einbauen
 

anti-held

Bekanntes Mitglied
Dann kannst du meine statt einem JFrame einen JDialog verwenden und modal auf true setzen. Dazu noch als parent deinen Frame vom Hauptprogramm übergeben und es wird derzeit das Hauptprogramm blockiert.
Was in meiner main-Methode steht muss halt dann in dem Actionlistener deines JButtons ausgeführt werden.
 

Underfaker

Bekanntes Mitglied
Selbes Problem wie bereits beschreiben das Programm arbeitet nicht weiter.
ps: Dialog und modal sind schon gesetzt im obigen Code.

Java:
import java.awt.EventQueue;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Window.Type;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class WaitForGeneration {

	private JDialog frame_WaitForGeneration;
	private JFrame frame;

	public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    WaitForGeneration window = new WaitForGeneration();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
	
	/**
	 * Create the application.
	 */
	public WaitForGeneration() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.getContentPane().setBackground(Color.WHITE);
		frame.setTitle("Prozess in Arbeit");
		frame.setBounds(100, 100, 612, 311);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				 EventQueue.invokeLater(new Runnable() {
			           
			            @Override
			            public void run() {
			            	openWaitForGenerationWindow();
							for (int i = 0; i < 1000000; i++)
			                    System.out.println("bla");
							frame_WaitForGeneration.dispose();
			            }
			        });
				
			}
		});
		btnNewButton.setBounds(72, 37, 233, 90);
		frame.getContentPane().add(btnNewButton);
		
	}
	
	private void openWaitForGenerationWindow()
	{
		frame_WaitForGeneration = new JDialog(frame,"",true);
		frame_WaitForGeneration.getContentPane().setBackground(Color.WHITE);
		frame_WaitForGeneration.setTitle("Prozess in Arbeit");
		frame_WaitForGeneration.setType(Type.UTILITY);
		frame_WaitForGeneration.setBounds(100, 100, 612, 97);
		frame_WaitForGeneration.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		frame_WaitForGeneration.getContentPane().setLayout(null);
		JLabel waitForGeneration_Caption = new JLabel("Die Aufgabenstellung wird generiert, dies kann einige Zeit in Anspruch nehmen...");
		waitForGeneration_Caption.setFont(new Font("Tahoma", Font.PLAIN, 13));
		waitForGeneration_Caption.setBounds(79, 11, 507, 40);
		frame_WaitForGeneration.getContentPane().add(waitForGeneration_Caption);
		//JLabel lbl_WaitForGeneration_Icon = new JLabel(new ImageIcon(ClassLoader.getSystemClassLoader().getResource("icons/Wait.png")));
		//lbl_WaitForGeneration_Icon.setBounds(10, 11, 64, 41);
		//frame_WaitForGeneration.getContentPane().add(lbl_WaitForGeneration_Icon);
		frame_WaitForGeneration.setVisible(true);
	}
}
 

anti-held

Bekanntes Mitglied
Deine Methode sieht folgendermaßen aus:

Java:
            public void actionPerformed(ActionEvent e) {
                 EventQueue.invokeLater(new Runnable() {
                        
                        @Override
                        public void run() {
                            openWaitForGenerationWindow();
                            for (int i = 0; i < 1000000; i++)
                                System.out.println("bla");
                            frame_WaitForGeneration.dispose();
                        }
                    });

Wie ich in meinem Beispiel aber beschrieben habe, musst du aber nur das [c]openWaitForGenerationWindow()[/c] in die invokeLater-Methode schreiben:

Java:
            public void actionPerformed(ActionEvent e) {
                 EventQueue.invokeLater(new Runnable() {
                        
                        @Override
                        public void run() {
                            openWaitForGenerationWindow();
                        }
                  });
                  for (int i = 0; i < 1000000; i++)
                  System.out.println("bla");
                  frame_WaitForGeneration.dispose();

p.s. sry für den späten post...
ich war das wochenende nicht erreichbar
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
J "Warte Frame" AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
M Swing Dynamischer Frame AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben