2016-12-07 5 views
1

Wenn ich auf die Schaltfläche klicke, wird eine weitere JFrame-Klasse geöffnet. Der JFrame wird nach 2 Sekunden auf dem Bildschirm angezeigt, aber das isVisible gibt vorher True zurück. Ich möchte den Timer starten, wenn der JFrame tatsächlich auf dem Bildschirm angezeigt wird. Wie kann ich das erreichen? Ich habe versucht, isShowing() und isDisplayable() zu verwenden, aber es gibt nicht das erwartete Ergebnis.Wie stellt man sicher, dass die Benutzeroberfläche von Swing tatsächlich auf dem Bildschirm angezeigt wird?

+2

2s lang scheint ein JFrame angezeigt werden, wahrscheinlich macht es nicht mehr reagiert aussehen. Vielleicht sollten Sie die Art und Weise ändern, wie Sie Ihren Frame und seinen Inhalt initialisieren, anstatt darauf zu warten, dass er angezeigt wird – jhamon

+0

Sie müssen einen Listener an Ihren JFrame anhängen, der ausgelöst wird, wenn Ihr JFrame angezeigt wird. Wie bei [WindowListener] (https://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowListener.html#windowOpened (java.awt.event.WindowEvent)) –

+0

stimme ich @jhamon zu . Ich hoffe, du versuchst nicht, einen möglichen Konstruktionsfehler zu umgehen. – byxor

Antwort

0

Man könnte so etwas wie folgt verwenden:

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.*; 

public class MainApp { 
    JFrame frame = new JFrame("Main"); 
    JButton button = new JButton("Toggle auxiliary"); 
    JFrame auxFrame = new JFrame("Auxiliary"); 

    public MainApp() { 
     button.addActionListener(evt -> { 
      // Delay displaying for 2 seconds 
      Timer timer = new Timer(2000, event -> { 
       auxFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       auxFrame.setSize(320, 240); 
       auxFrame.setVisible(true); 
      }); 
      timer.start(); 
      auxFrame.addWindowListener(new WindowAdapter() { 
       @Override 
       public void windowOpened(WindowEvent e) { 
        // Stop timer after the auxiliary frame is displayed 
        timer.stop(); 
       } 
      }); 

     }); 

     frame.add(button); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setSize(320, 240); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(MainApp::new); 
    } 
} 
Verwandte Themen