2012-04-01 14 views
1

は、これは私のコードです:リスナーが私のフレームが有効でないことを出力し、なぜのJava JScrollPaneの問題

public class JJD extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public JJD() { 
     super("test"); 

     JPanel center = new JPanel(); 
     center.setBackground(Color.red); 
     JScrollPane pane = new JScrollPane(center); 

     this.getContentPane().add(pane, BorderLayout.CENTER); 
     final JFrame fr = this; 
     this.addWindowFocusListener(new WindowFocusListener() { 

      @Override 
      public void windowLostFocus(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

       if (fr.isValid()) { 
        System.out.println("FOCUS VALID!"); 
       } else { 
        System.out.println("Focus INVALID"); 
       } 
      } 

      @Override 
      public void windowGainedFocus(WindowEvent arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     this.setVisible(true); 
     this.setSize(500, 500); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame fr = new JJD(); 
     fr.validate(); 

    } 

} 

あなたは私を教えてもらえますか?私はpack()revalidate()のような他のメソッドも試しましたが、リスナーは自分のフレームが有効でないことを表示します。

ヒント:問題はJScrollPaneですが、私のフレームを有効にする方法を理解できません。

+0

なぜあなたの状況で重要ですか?あなたのリスナーが呼び出されたときに、インターナリ検証更新がまだ準備ができていない可能性があります... – kleopatra

答えて

2

windowsGainedFocusメソッドをオーバーライドしていない可能性があると思います。

public void windowGainedFocus(WindowEvent arg0) { 
    if (fr.isValid()) { 
     System.out.println("FOCUS VALID!"); 
    } else { 
     System.out.println("Focus INVALID"); 
    } 
} 

他のものと同じように上書きして、有効かどうかを調べることができます。それが動作しない場合は、fr.validate()メソッド呼び出しをelse節に追加できます。私はそれが助けてくれることを望む。