Как заставить JWindow сразу рисовать - PullRequest
0 голосов
/ 01 декабря 2018

Как мне заставить 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();
            }
        });
    }
}

1 Ответ

0 голосов
/ 01 декабря 2018

Вероятное узкое место:

startupScreen[0].add(new JLabel(new ImageIcon(
        MyApp.class.getResource("splash-screen.png"))), 
        BorderLayout.CENTER);

или, более конкретно, здесь:

MyApp.class.getResource("splash-screen.png")

, когда вы читаете в несжатом и, возможно, большом .png ресурсе изображения.Решения включают в себя не требовать изображения или чтения в сжатом формате .jpg меньшего размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...