Java Swing: JWindow появляется за всеми другими окнами процесса и не исчезнет - PullRequest
2 голосов
/ 30 ноября 2011

Я использую 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 появляется за всеми открытыми экземплярами окон на моем компьютере. Скрытие JWindow также не работает.

    SwingUtilities.invokeLater(new Runnable(){

        @Override
        public void run() {
            MySplash.getInstance().hideSplash();
        }

    });

1 Ответ

4 голосов
/ 30 ноября 2011

Возможно, вы захотите взглянуть на java.awt.SplashScreen.Однако, если ваше сердце настроено на ваше решение:

Глядя на Window#toFront,

Если это окно видно, переносит это окно на передний плани может сделать его сфокусированным окном.

Попробуйте сделать ваш JWindow видимым, прежде чем вывести его на передний план.

Я не уверен, почему ваш JWindow нетсокрытие, эта часть работает для меня.

/ e1
Если вы пытаетесь реализовать singleton pattern , вы должны сделать свой конструктор и поле приватными.Возможно, вы также захотите взглянуть на Какой эффективный способ реализации одноэлементного шаблона в Java? .

/ e2
return s в конце вашегоМетоды showSplash и hideSplash не нужны, метод в любом случае возвратился бы в этот момент.

...