框架始终只在我的程序之上

我正在尝试在未修饰的alwaysOnTop框架中创建一种工具栏。 因此,我希望我的框架位于我的主框架之上,但不希望我的框架位于其他程序的框架之上。 我试过这段代码:

public class Test { private static JFrame mainFrame; /** * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { mainFrame = new JFrame("test"); mainFrame.setSize(800,600); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); mainFrame.setVisible(true); A a = new A(); } }); } public static class A extends JDialog { public A() { super(mainFrame); setAlwaysOnTop(true); setFocusable(false); setSize(80,60); setVisible(true); } } } 

但是尽管使用了JDialog并且对所有者进行了精确处理,但框架仍然位于其他应用程序之上(至少使用Ubuntu。可能结果与其他操作系统不同?)

编辑 :好的,我为我的对话框尝试了这段代码:

 public static class A extends JDialog { public A(String name) { super(mainFrame, name); setAlwaysOnTop(true); setFocusable(false); setSize(80, 60); setVisible(true); mainFrame.addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { A.this.setAlwaysOnTop(true); } @Override public void windowDeactivated(WindowEvent e) { // A.this.setAlwaysOnTop(false); A.this.toBack(); } }); } } 

现在的问题是,当主窗口松散焦点时,对话框会抢回焦点,我不明白为什么。 例如,我运行我的应用程序,我尝试切换到Firefox,Firefox出现并覆盖mainFrame,但A对话框获得焦点并保持在屏幕上。 现在,如果我再次选择Firefox,对话框将最终正确消失。 你能解释一下为什么对话会成为焦点吗?

谢谢

只有当父窗口激活时,才能使窗口始终位于顶部。 像这样的东西:

 public class Test { private static JFrame mainFrame; /** * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { mainFrame = new JFrame("test"); mainFrame.setSize(800,600); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); mainFrame.setVisible(true); final A a = new A(); mainFrame.addWindowListener(new WindowAdapter() { /** * {@inheritDoc} */ @Override public void windowDeactivated(WindowEvent e) { a.setAlwaysOnTop(false); } /** * {@inheritDoc} */ @Override public void windowActivated(WindowEvent e) { a.setAlwaysOnTop(true); } }); } }); } public static class A extends JDialog { public A() { super(mainFrame); setAlwaysOnTop(true); setFocusable(false); setSize(80,60); setVisible(true); } } } 

好的,我找到了一个解决方案(不知道它是否是解决方案,但它正在运行,所以…)

我发现了setFocusableWindowState(),它非常适合工具栏。 顺便说一句,我不知道我之前的setFocusable(false)是否有任何影响。

下一个问题是这个代码的焦点变得非常奇怪:如果我从MyApp切换到Firefox,会发生以下情况:

 focus : MyApp -> Firefox execution of MyDialog.toFront() focus : Firefox -> MyDialog MyDialog not focusable ! focus : MyDialog -> MyApp !!! 

结果:没有改变!

所以我终于得到了一些技巧:在MyDialog.toFront()之后,你将焦点交还给前一个所有者。 我发现没有错误的唯一方法是:mainFrame.toBack()

最终代码:

 public class Test { private static JFrame mainFrame; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { mainFrame = new JFrame("test"); mainFrame.setSize(800,600); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); mainFrame.setVisible(true); A a = new A(); } }); } public static class A extends JDialog { public A() { super(mainFrame); setAlwaysOnTop(true); setFocusableWindowState(false); setSize(80,60); setVisible(true); mainFrame.addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) {A.this.setAlwaysOnTop(true);} @Override public void windowDeactivated(WindowEvent e) { A.this.toBack(); mainFrame.toBack(); } }); } } }