JDialog的扩展(隐藏?)没有出现在父JFrame的前面?

时间:2015-04-06 04:46:54

标签: java swing jframe jdialog

我有一个应用程序,我正在为游戏自动更新游戏客户端。

按下Launch后,它会打开我的DownloadFrame(extends JDialog),如下所示:

screenshot1

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

screenshot2

这是我扩展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
                 */
            }
        }
    });

1 个答案:

答案 0 :(得分:3)

  

然而,当你再次最大化应用程序时,我会假设JDialog隐藏在父级后面

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

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