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 появляется за всеми открытыми экземплярами окон на моем компьютере. Скрытие JWindow также не работает.
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
MySplash.getInstance().hideSplash();
}
});
1 ответ
Возможно, вы захотите взглянуть на java.awt.SplashScreen
, Однако, если ваше сердце настроено на ваше решение:
Смотря на Window#toFront
,
Если это окно является видимым, переносит это окно вперед и может сделать его сфокусированным.
Попробуйте сделать свой JWindow
видимо, прежде чем принести его на фронт.
Я не уверен, почему ваш JWindow
не прячется, эта часть работает для меня.
/ e1
Если вы пытаетесь реализовать одноэлементный шаблон, вы должны сделать свой конструктор и поле приватным. Возможно, вы также захотите взглянуть на Что является эффективным способом реализации одноэлементного шаблона в Java?,
/ е2
return
в конце вашего showSplash
а также hideSplash
методы не нужны, метод все равно вернулся бы на этом этапе.