Java JDialog的扩展(隐藏?)没有显示在父JFrame前面?

Java JDialog的扩展(隐藏?)没有显示在父JFrame前面?,java,swing,jframe,jdialog,Java,Swing,Jframe,Jdialog,我有一个为游戏制作的应用程序,可以自动更新游戏客户端 一旦按下Launch,它将打开我的下载框(extensedjdialog),如下所示: 如果您单击任务栏中应用程序的图标(可能是Windows 8的问题?),它会像往常一样最小化应用程序。但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面。看起来是这样的: 这是我的JDialog扩展代码。为它的凌乱预先道歉 public class DownloadFrame extends JDialog implements Run

我有一个为游戏制作的应用程序,可以自动更新游戏客户端

一旦按下Launch,它将打开我的下载框(
extensedjdialog
),如下所示:

如果您单击任务栏中应用程序的图标(可能是Windows 8的问题?),它会像往常一样最小化应用程序。但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面。看起来是这样的:

这是我的JDialog扩展代码。为它的凌乱预先道歉

public class DownloadFrame extends JDialog implements Runnable {

private static final long serialVersionUID = -8764984599528942303L;

private Background frame;
private ImageIcon[] gifs;

private JLabel spinner;

public DownloadFrame() {
    super(Loader.application, false);
    setLayout(null);
    setUndecorated(true);
    setAutoRequestFocus(true);
    new Thread(this).start();
    generateBackground();
    generateButton();
    generateGif();
}

private void generateBackground() {
    frame = new Background("sub_background.png");
    setSize(frame.getWidth(), frame.getHeight());
    setBackground(new Color(1.0f, 1.0f, 1.0f, 0.0f));
    setLocationRelativeTo(null);
    setLocation(this.getX(), this.getY() + 5);
    setLayout(null);
    setContentPane(frame);
}

private void generateGif() {
    gifs = Utils.generateGifImages();
    spinner = new JLabel(gifs[0]);
    spinner.setBounds(70, 30, gifs[0].getIconWidth(), gifs[0].getIconHeight());
    add(spinner);
}

private HoverableButton cancel;

public HoverableButton getCancelButton() {
    return cancel;
}

private void generateButton() {
    cancel = new HoverableButton(Settings.CANCEL_BUTTON, 75, 145);
    cancel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            /*
             * TODO -
             * stop the download in progress
             */
            for (HoverableButton button : Loader.application.getPrimaryButtons()) {
                button.setActive(true);
                button.setVisible(true);
            }
            dispose();
        }
    });
    add(cancel);
}

private int cycleCount;

private void cycleGif() {
    if (spinner == null) {
        return;
    }
    cycleCount++;
    if (cycleCount > 7) {
        cycleCount = 0;
    }
    spinner.setIcon(gifs[cycleCount]);
}

@Override
public void run() {
    while (true) {
        cycleGif();
        try {
            Thread.sleep(100L);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    }
}
如果需要的话,这是我的用法。我敢肯定,大部分内容都可以忽略,只是在下载过程中隐藏四个按钮而已

((HoverableButton) components[2]).addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            HoverableButton source = (HoverableButton) components[2];
            if (source.isActive()) {
                try {
                    Thread.sleep(500L);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                if (panel == null) {
                    panel = new DownloadFrame();
                    panel.setVisible(true);
                } else {
                    panel.setVisible(true);
                    panel.getCancelButton().removeHighlight();
                }
                for (HoverableButton button : getPrimaryButtons()) {
                    button.setActive(false);
                    button.setVisible(false);
                    button.removeHighlight();
                }
                /*
                 * TODO -
                 * handle checking for updates / downloading updates
                 */
            }
        }
    });
但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面

对。创建JDialog时,需要在构造函数中指定对话框的“所有者”JFrame

因此,在创建对话框之前,必须创建并使JFrame可见

但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面

对。创建JDialog时,需要在构造函数中指定对话框的“所有者”JFrame

因此,在创建对话框之前,必须创建并使JFrame可见

但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面

对。创建JDialog时,需要在构造函数中指定对话框的“所有者”JFrame

因此,在创建对话框之前,必须创建并使JFrame可见

但是,当您再次最大化应用程序时,我假设JDialog将隐藏在父级后面

对。创建JDialog时,需要在构造函数中指定对话框的“所有者”JFrame


因此,在创建对话框之前,必须创建并使JFrame可见。

创建框架,并通过super(Loader.application,false)将其设置为所有者。构造函数将应用程序框架指定为父框架,布尔值用于使对话框成为模态(我相信)。如果这不起作用,让我知道!如果对话框未显示在框架上方,则说明您做错了。创建一个简单的例子来证明我刚才解释的概念。也就是说,使用框架作为所有者创建一个JFrame和一个JDialog,并使这两个窗口都可见。然后最小化框架并单击任务栏上的框架图标。这种类型的代码称为a,用于演示问题。一旦你向自己证明了这个概念是可行的,你就会明白为什么你的代码是不同的。如果你不能让这个概念发挥作用,那么你可以在论坛上发布一些小代码。框架被创建,并通过super(Loader.application,false)设置为所有者。构造函数将应用程序框架指定为父框架,布尔值用于使对话框成为模态(我相信)。如果这不起作用,让我知道!如果对话框未显示在框架上方,则说明您做错了。创建一个简单的例子来证明我刚才解释的概念。也就是说,使用框架作为所有者创建一个JFrame和一个JDialog,并使这两个窗口都可见。然后最小化框架并单击任务栏上的框架图标。这种类型的代码称为a,用于演示问题。一旦你向自己证明了这个概念是可行的,你就会明白为什么你的代码是不同的。如果你不能让这个概念发挥作用,那么你可以在论坛上发布一些小代码。框架被创建,并通过super(Loader.application,false)设置为所有者。构造函数将应用程序框架指定为父框架,布尔值用于使对话框成为模态(我相信)。如果这不起作用,让我知道!如果对话框未显示在框架上方,则说明您做错了。创建一个简单的例子来证明我刚才解释的概念。也就是说,使用框架作为所有者创建一个JFrame和一个JDialog,并使这两个窗口都可见。然后最小化框架并单击任务栏上的框架图标。这种类型的代码称为a,用于演示问题。一旦你向自己证明了这个概念是可行的,你就会明白为什么你的代码是不同的。如果你不能让这个概念发挥作用,那么你可以在论坛上发布一些小代码。框架被创建,并通过super(Loader.application,false)设置为所有者。构造函数将应用程序框架指定为父框架,布尔值用于使对话框成为模态(我相信)。如果这不起作用,让我知道!如果对话框未显示在框架上方,则说明您做错了。创建一个简单的例子来证明我刚才解释的概念。也就是说,使用框架作为所有者创建一个JFrame和一个JDialog,并使这两个窗口都可见。然后最小化框架并单击任务栏上的框架图标。这种类型的代码称为a,用于演示问题。一旦你向自己证明了这个概念是可行的,你就会明白为什么你的代码是不同的。如果你不能让这个概念发挥作用,那么你可以在论坛上发布一些小代码。