2016-12-07 4 views
1

ボタンをクリックすると、別のJFrameクラスが開かれています。 2秒後にJFrameが画面に表示されますが、その前にisVisibleがtrueを返します。 JFrameが実際に画面に表示されたら、タイマーを開始したい。どうすればこれを達成できますか? isShowing()とisDisplayable()を使用しようとしましたが、期待した結果が得られていません。スイング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); 
    } 
} 
関連する問題