2016-12-07 74 views
1

當我點擊按鈕時,另一個JFrame類被打開。 JFrame將在2秒後在屏幕上可見,但isVisible在此之前返回true。我想在JFrame實際顯示在屏幕上時啓動計時器。我怎樣才能做到這一點?我試圖使用isShowing()和isDisplayable(),但它沒有給出預期的結果。如何確保Swing UI實際上顯示在屏幕上?

+2

2S似乎長時間才能顯示一個JFrame,可能使它看起來反應遲鈍。也許你應該改變初始化框架和它的內容的方式,而不是等待它顯示 – jhamon

+0

你將不得不附加一些監聽器到你的JFrame中,當你的JFrame被顯示時它將被觸發。像[WindowListener](https://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowListener.html#windowOpened(java.awt.event.WindowEvent)) –

+0

我同意@jhamon 。我希望你不是想解決潛在的設計缺陷。 – byxor

回答

0

你可以使用這樣的事情:

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