2012-04-01 68 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 2012-04-01 14:12:47

回答

2

我认为这可能是因为你没有覆盖windowsGainedFocus方法。

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

你可以重写它就像另一个,看它是否有效。如果它不起作用,您可以在else子句中添加fr.validate()方法调用。我希望这会有所帮助。