Java Swing: JWindow出现在所有其他进程窗口后面,并且不会消失



我使用JWindow在应用程序启动期间显示我的闪屏。然而,它不会出现在所有的窗口前,因为它应该,它也不会消失。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
public class MySplash {
    public static MySplash INSTANCE;
    private static JWindow jw;
    public MySplash(){
        createSplash();
    }
    private void createSplash() {
        jw = new JWindow();
        JPanel content = (JPanel) jw.getContentPane();
        content.setBackground(Color.white);
        // Set the window's bounds, centering the window
        int width = 328;
        int height = 131;
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (screen.width - width) / 2;
        int y = (screen.height - height) / 2;
        jw.setBounds(x, y, width, height);
        // Build the splash screen
        JLabel label = new JLabel(new ImageIcon("splash.jpg"));
        JLabel copyrt = new JLabel("SplashScreen Test",
            JLabel.CENTER);
        copyrt.setFont(new Font("Sans-Serif", Font.BOLD, 12));
        content.add(label, BorderLayout.CENTER);
        content.add(copyrt, BorderLayout.SOUTH);
        Color oraRed = new Color(156, 20, 20, 255);
        content.setBorder(BorderFactory.createLineBorder(oraRed, 0));
    }
    public synchronized static MySplash getInstance(){
        if(INSTANCE==null){
            INSTANCE = new MySplash();
        }
        return INSTANCE;
    }
    public void showSplash(){
        jw.setAlwaysOnTop(true);
        jw.toFront();
        jw.setVisible(true);
        return;
    }
    public void hideSplash(){
        jw.setAlwaysOnTop(false);
        jw.toBack();
        jw.setVisible(false);
        return;
    }
}

在扩展JFrame的主类中,我用

来命名闪屏
    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            MySplash.getInstance().showSplash();
        }
    });

但是,JWindow出现在我计算机上所有打开的windows实例的后面。隐藏JWindow也不起作用

    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            MySplash.getInstance().hideSplash();
        }
    });

您可能想看看java.awt.SplashScreen。但是,如果您下定决心要解决这个问题:

Window#toFront

如果此窗口是可见的,则将此窗口移到前面并可能设置为聚焦窗口

试着让你的JWindow可见之前把它带到前面。

我不知道为什么你的JWindow不隐藏,那部分为我工作。

/e1
如果你想实现一个单例模式,你应该把构造函数和字段设为私有。您可能还想看看在Java中实现单例模式的有效方法是什么?

/e2
showSplashhideSplash方法末尾的return s是不必要的,无论如何该方法都会在那个点返回。

相关内容

  • 没有找到相关文章

最新更新