Java 新窗口夹在父窗口和子窗口JFrame/JDialog之间

Java 新窗口夹在父窗口和子窗口JFrame/JDialog之间,java,swing,gnome,Java,Swing,Gnome,来自其他进程的新窗口在一个集中的JDialog子进程后面但在JDialog父进程前面打开。我希望新的窗户会出现在孩子面前。这些窗口中没有一个声明始终位于顶部 图画 查看应用程序3是否在应用程序2窗口之间 它在应用程序1后面并不重要-始终在顶部,这是意料之中的 实际订单 JDialog (App 1 - always on top) JFrame (App 2 non modal dialog child of app 2 main) JDialog (App 3) <=== new

来自其他进程的新窗口在一个集中的JDialog子进程后面但在JDialog父进程前面打开。我希望新的窗户会出现在孩子面前。这些窗口中没有一个声明始终位于顶部

图画

  • 查看应用程序3是否在应用程序2窗口之间
  • 它在应用程序1后面并不重要-始终在顶部,这是意料之中的

实际订单

JDialog (App 1 - always on top)
JFrame (App 2 non modal dialog child of app 2 main)
JDialog (App 3) <=== new window should appear on top of app 2
JFrame (App 2 - main window)
是否有任何选项可以应用于JDialog子级,以允许窗口显示在其上方。背景是我正在开发“App2”应用程序,所有其他部分和Redhat Linux安装都由其他第三方管理,因此无法轻松更改

尝试使用严格/智能窗口管理器选项,但行为没有差异

gconftool-2 --set /schemas/apps/metacity/general/focus_new_windows --type string smart
gconftool-2 --set /schemas/apps/metacity/general/focus_new_windows --type string strict
黑客解决方案
  • 显示、隐藏,然后再次显示App 3窗口。在这种情况下,它正确地出现在“app2 child”上方,尽管这会引起明显的闪烁
代码


总之,对于这个特定于Linux windows管理的问题,没有很好的解决方案。所能做的就是从应用程序中删除始终位于顶部的窗口。无论如何,这是最佳实践,但在处理遗留代码库时很困难

唯一的另一种解决方法是进行setVisible()舞蹈


1) “有一个来自另一个进程的现有框架总是在上面声明的,这可以是Java或其他应用程序”真的没有办法修复它。一些“总是在上面”的应用程序。为了达到永远领先的目标,甲骨文将不惜一切代价,而甲骨文只准备不惜一切代价来确保一款应用。他总是高高在上。2) 看,它很可能是应用程序。如果“其他帧”实际上是模式对话框,指定“始终在顶部”应用程序,则将起作用。作为对话框的父级或所有者。感谢您的输入。需要明确的是,应用程序中只有一个JFrame。其他JFrames处于单独的进程中,仅用于演示问题……事实上,始终位于顶部的应用程序具有副作用,这意味着其他两个应用程序中的两个窗口顺序不正确。。。这就好像gnome窗口管理器有一些代码说“如果打开的窗口位于始终在顶部的窗口后面,那么…”很明显,应用程序中只有一个JFrame。其他JFrame处于单独的进程中,仅用于演示问题…”OK cool。你能按照“我的AOT应用程序”和“其他非AOT应用程序。我的应用程序后面应该有什么…”的思路重新调整窗口吗。我发现“父母”/“孩子”的标题令人困惑。另外,您能用一个
main(String[])
方法在单个源代码中表达这个问题吗?这样,其他人更容易编译(运行)和测试。甚至在其他窗口添加编号,以确定哪个窗口应该从后向前most@AndrewThompson再次感谢,很抱歉这是一个很难解释的问题。我最初做了三个独立的应用程序,将问题缩小到窗口管理器的问题。重新创建为组合示例并更新了屏幕截图。希望这更清楚。
public class Combined {
    public static void main(String[] args) throws Exception {

        JFrame aot = new JFrame("App 1 - always on top");
        aot.setAlwaysOnTop(true);
        aot.setBounds(50, 50, 300, 40);
        aot.setVisible(true);

        JFrame frame = new JFrame("App 2 - main window");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 300, 200);
        frame.setVisible(true);

        JDialog child = new JDialog(frame, "App 2 - non-modal child dialog (child)");
        child.setBounds(150, 150, 300, 200);
        child.setVisible(true);

        Thread.sleep(1000);
        JFrame newWindow = new JFrame("App 3");
        newWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        newWindow.setBounds(200, 20, 300, 200);
        // newWindow.setBounds(370, 20, 300, 200);

        newWindow.setVisible(true);
    }
}
gconftool-2 --set /schemas/apps/metacity/general/focus_new_windows --type string smart
gconftool-2 --set /schemas/apps/metacity/general/focus_new_windows --type string strict
newWindow.setVisible(true);
newWindow.setVisible(false);
newWindow.setVisible(true);
newWindow.setVisible(true);
newWindow.setVisible(false);
newWindow.setVisible(true);