Как мне заставить JWindow немедленно рисовать?В моем примере ниже между окнами отображения и рисования есть ПОЛНЫЕ 2 секунды, что измеряется от вывода журнала «done» до «painting jwindow».Когда окно впервые отображается, оно пустое.Через две секунды появится изображение «splash-screen.png».
Я не хочу использовать встроенную поддержку заставки в Java.У него есть проблемы.Пожалуйста, давайте не будем вдаваться в это.Я уже провел дни, исследуя его ... он не работает для моего случая (не полностью описан здесь).
Я много раз подряд запускал этот код, чтобы посмотреть, не уменьшается ли задержка ...остается на 2 секунды ... очень последовательно.Я работаю на MacOS 10.14.1 и JDK 10.0.2.
Вот мой SSCCE:
import java.util.logging.Logger;
import javax.swing.JWindow;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class MyApp {
private final static Logger LOG = Logger.getLogger(MyApp.class.getName());
public static void main(String args[]) throws Exception {
final JWindow[] startupScreen = {null};
SwingUtilities.invokeAndWait(() -> {
try {
Thread.currentThread().setPriority(10);
LOG.info("edt thread priority: "+Thread.currentThread().getPriority());
startupScreen[0] = new JWindow() {
@Override
public void paint(Graphics g) {
super.paint(g);
LOG.info("painting jwindow");
}
};
/*
LOG.info("set layout");
startupScreen[0].setLayout(new BorderLayout());
*/
LOG.info("add splash image");
startupScreen[0].add(
new JLabel(new ImageIcon(
MyApp.class.getResource("splash-screen.png")
)), BorderLayout.CENTER);
LOG.info("pack");
startupScreen[0].pack();
LOG.info("set relative location");
startupScreen[0].setLocationRelativeTo(null);
LOG.info("set visible");
startupScreen[0].setVisible(true);
startupScreen[0].repaint();
startupScreen[0].revalidate();
LOG.info("done");
} catch (Exception ex) {
ex.printStackTrace();
}
});
}
}