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
 
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:
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:
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.
 
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
 
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.
 
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);
	}
}
 
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
 

Neue Themen


Zurück
Oben