2017-09-05 1 views
0

Ich habe hier ein Problem mit meinem Code, das ich nicht erklären kann. Ich habe zwei Jframes, die erste hat eine Schaltfläche, die beim Anklicken zum zweiten Frame führt. Das funktioniert gut. Aber ein Problem ist hier: der zweite Rahmen erscheint zuerst als skeleton, ohne den JComponents ich hinzugefügt habe. Es wird gewartet, bis alle Anweisungen ausgeführt werden, dh wenn paints die JComponents über die JFrameskeleton angezeigt wird.Warum verzögert Swing den JFrame hier vollständig?

Warum ist das so? Wie kann ich vor dem Ausführen der nächsten Codezeile alle Komponenten vollständig anzeigen lassen?

Unten ist mein Code

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

/** 
* 
* @author JWizard 
*/ 
public class Test { 

    private JFrame frame; 
    private JButton button; 

    public Test() { 
     initGUI(); 
     button.addActionListener((ActionEvent e) -> { 
      JFrame frame1 = new JFrame("Second Jframe"); 
      frame1.setPreferredSize(new Dimension(300, 300)); 
      frame1.getContentPane().add(new JLabel("Swing Component")); 
      frame1.pack(); 
      frame1.setVisible(true); 
      frame1.setLocationRelativeTo(null); 
      /** 
      * After executing the above line, 
      * 'frame1.setLocationRelativeTo(null);', I am expecting the program 
      * to have fully "painted" my fame1 GUI, showing the label. 
      */ 
      try { 
       Thread.sleep(7000); 
       System.out.println("statement 1"); 
       Thread.sleep(7000); 
       System.out.println("statement 2");//after executing this statment thats when 
       //the program paints the components of frame1 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }); 

    } 

    private void initGUI() { 
     frame = new JFrame("Frame 1"); 
     button = new JButton("Go to Frame 2"); 
     frame.setLayout(new FlowLayout(FlowLayout.LEADING)); 
     frame.setPreferredSize(new Dimension(300, 300)); 
     frame.getContentPane().add(button); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

    } 

    public static void main(String[] args) { 
     Test text = new Test(); 
    } 

} 
+0

Sie den Event Dispatch Thread blockiert, die die Neulackierung der UI Griffe usw. – Thomas

+0

@Thomas Wo ich bin Blockierung? – JWizard

+3

"Wo blockiere ich es?" 'Thread.sleep (7000);' Hier. – Fildor

Antwort

1

diesen einen Versuch geben:

public Test() { 
     initGUI(); 
     button.addActionListener((ActionEvent e) -> { 
      JFrame frame1 = new JFrame("Second Jframe"); 
      frame1.setPreferredSize(new Dimension(300, 300)); 
      frame1.getContentPane().add(new JLabel("Swing Component")); 
      frame1.pack(); 
      frame1.setVisible(true); 
      frame1.setLocationRelativeTo(null); 

      new SwingWorker<Void, Void>() { 
       @Override 
       protected Void doInBackground() throws Exception { 
        try { 
         Thread.sleep(7000); 
         System.out.println("statement 1"); 
         Thread.sleep(7000); 
         System.out.println("statement 2"); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
        } 
        return null; 
       } 
      }.execute(); 
     }); 

} 
+0

Danke Ihre Lösung beantwortet meine zweite Frage. Ich habe das Konzept. – JWizard

Verwandte Themen