子窗口的类
public class Find  implements ActionListener,WindowFocusListener{
private Frame owner;
private JDialog fd;
private JTextComponent findfrom; Find(){
fd = new JDialog(owner , false);
//其他代码略
}
public void setNeedCtl(Frame win,JTextComponent jc){
owner = win;
findfrom = jc;
owner.addWindowFocusListener(this);
fd.addWindowFocusListener(this);
fd.setLocation(owner.getLocation().x+100, owner.getLocation().y+250);
}
public void hideme(){
fd.setVisible(false);
}
public void showme(){
fd.setVisible(true);
}
public void windowGainedFocus(WindowEvent e) {
// if(e.getSource()==owner&&this.isVisible()) {
// this.toFront();
// this.transferFocus();
// }
}
public void windowLostFocus(WindowEvent e) {
}
}
在另一个类中(继承了JFrame)
private Find fd = new Find();
fd.fd.setNeedCtl(this, jta);问题:我想让子窗口有这样的特点(就像“记事本”中的“查找”窗口一样):
1.一直在父窗口的前面。把JDialog设为有模式窗口可以,但是当他打开时父窗口就处于等待状态,也争夺了父窗口的焦点,不好。
2.不会争夺父窗口的焦点。把JDialog设为无模式窗口可以,但是当点击父窗口时,子窗口就被父窗口覆盖,不好。

解决方案 »

  1.   

    JLayeredPane 能否满足你的要求
      

  2.   

    你说的是WindowFocusListener吧,我用过,但是下面被注释掉的代码貌似没有达到目的,希望你能自己实验一下。据我猜测,当因点击子窗口造成主窗口去焦点时马上判断在windowGainedFocus(WindowEvent e) 判断子窗口是否有焦点,得到的结果不正确。
    public void windowGainedFocus(WindowEvent e) { 
    // if(e.getSource()==owner&&this.isVisible()) { 
    // this.toFront(); 
    // this.transferFocus(); 
    // } 

    public 
      

  3.   

    我的子窗口是一个JDialog
    我做了下面的尝试:
    JLayeredPane lp = new JLayeredPane();
    lp.add(fd);
    lp.add(owner);
    lp.setPosition(owner, -1);
    但是出错
    在lp.add(fd);
    错误:[code=Java]Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.checkNotAWindow(Unknown Source)
    at java.awt.Container.addImpl(Unknown Source)
    at javax.swing.JLayeredPane.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at Find.setNeedCtl(Find.java:95)
    at Find.<init>(Find.java:46)
    at Notepad.<init>(Notepad.java:41)
    at Notepad.main(Notepad.java:46)[code]