Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Проблема с заставкой


Автор: MOFA 25.6.2008, 00:23
Есть класс, который выводит заставку перед запуском программы:

Код

package main.uiforms;

import main.uiforms.utils.ImgIcon;

import javax.swing.*;
import java.awt.*;

public class Splash {

    private JFrame splashFrame= new JFrame ();

    public Splash (String imgPath, Dimension imgSize) {
        
        ImgIcon ii = new ImgIcon();
        ImageIcon splashImg = ii.getImageIcon(imgPath, false);
        JLabel splashLabel = new JLabel (splashImg);

        Rectangle screenRect = splashFrame.getGraphicsConfiguration().getBounds();
        splashFrame.setSize(imgSize);
        splashFrame.setLocation (
                    screenRect.x + screenRect.width/2 - splashFrame.getSize().width/2,
                    screenRect.y + screenRect.height/2 - splashFrame.getSize().height/2);
        splashFrame.setUndecorated(true);

        Container splashContent = splashFrame.getContentPane();
        splashContent.setBackground(Color.white);

        splashContent.add(splashLabel);
    }

    public void showSplash (long time) {
        splashFrame.setVisible(true);
        Delay (time);
        splashFrame.setVisible(false);
    }

    private static void Delay (long time){

        try {
            Thread.sleep(time);
        }
        catch (InterruptedException e) {
            //e.printStackTrace();
            System.out.println(e.toString());

            long endTime= System.currentTimeMillis() + time;
            while (System.currentTimeMillis() < endTime ){}
        }
    }
}



Вызываю так:
Код

Splash mySplash = new Splash ("resources/images/splash.gif", new Dimension(560,300));
mySplash.showSplash (2300);


Выводит почемуто пустой фрейм, без изображения. Пробовал по этому пути файл изображения удалять, выдает ошибку, тоесть файл видит,но не выводит.
Давно уже мучаюсь, поэтому пишу.
Еще наверное нужен код этого класса:

Код

package main.uiforms.utils;

import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;

public class ImgIcon {

    public ImgIcon() {}

    public ImageIcon getImage (String urlname)
    {
        Image img = null;

        try {

            URL url = this.getClass().getResource (((urlname.substring(0)== "/")?(""):("/")) + urlname);
            img = Toolkit.getDefaultToolkit().getImage (url);
        }
        catch (NullPointerException npe) {

            //TODO: lang variable
            System.err.println ("Зображення не знайдене");
        }

        return new ImageIcon(img);
    }

     public Image getImage (String urlname, boolean fullPath) {
        Image img = null;

        try {
            URL url = new PathUtil().getURL(urlname);
            //System.out.println(url);
            if (fullPath) {
                img = Toolkit.getDefaultToolkit().getImage (urlname);
            }
            else {
                img = Toolkit.getDefaultToolkit().getImage (url);
            }
        }
        catch (NullPointerException npe) {
            System.err.println ("Image [" + urlname + "] not found.");
        }

        return img;
    }

    public ImageIcon getImageIcon (String urlname, boolean fullPath) {

        return new ImageIcon (getImage(urlname, fullPath));
    }
}


Автор: Kangaroo 25.6.2008, 00:44
В java 6 есть http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/splashscreen/.

А по коду - ошибка где-то в загрузке изображения, сам вывод вроде правильный.

Автор: MOFA 27.6.2008, 23:27
Переписал класс так, без лишних наворотов :
Код

package main.uiforms;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Rectangle;

public class Splash {

    private JFrame splashFrame= new JFrame ();

    public Splash (String imgPath, Dimension imgSize) {

        Rectangle screenRect = splashFrame.getGraphicsConfiguration().getBounds();
        splashFrame.setSize(imgSize);
        splashFrame.setLocation (
                    screenRect.x + screenRect.width/2 - splashFrame.getSize().width/2,
                    screenRect.y + screenRect.height/2 - splashFrame.getSize().height/2);
        splashFrame.setUndecorated(true);

        Container splashContent = splashFrame.getContentPane();

        ImageIcon splashImg = new ImageIcon(imgPath);
        JLabel splashLabel = new JLabel(splashImg);
        splashContent.add(splashLabel);
        splashContent.repaint();
        splashFrame.pack();
    }

    public void showSplash (long time) {
        splashFrame.setVisible(true);
        Delay (time);
        splashFrame.setVisible(false);
    }

    private static void Delay (long time){

        try {
            Thread.sleep(time);
        }
        catch (InterruptedException e) {
            long endTime= System.currentTimeMillis() + time;
            while (System.currentTimeMillis() < endTime ){}
        }
    }
}



Теперь вроде асе должно отображать. Но тем не менее показывает пустой фрейм без рамки, но и без картинки.
Картинку точно находит, я в отладке проверял!
Запустите у себя, пожалуйста. Уже пару дней мучаюсь, не могу понять в чем причина.

Автор: w1nd 27.6.2008, 23:53
MOFA, ваш код прекрасно работает, если подсунуть путь к существующей картинке. Хотя я бы его сократил:

Код
import java.awt.Dimension;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Splash {

    private JFrame splashFrame= new JFrame ();

    public Splash (String imgPath) {
        splashFrame.setUndecorated(true);
        splashFrame.setContentPane(
         new JLabel(
             new ImageIcon(imgPath)
         )
        );

        splashFrame.pack();
        splashFrame.setLocationRelativeTo(null);
    }

    public void showSplash (long time) {
        splashFrame.setVisible(true);
        Delay (time);
        splashFrame.setVisible(false);
    }

    private static void Delay (long time){
        try {
            Thread.sleep(time);
        }
        catch (InterruptedException e) {
        }
    }
    
}

Автор: MOFA 28.6.2008, 00:39
Спасибо за то что попробовали. В Вашем сокращении кода разобрался, переписал себе, за это тоже спасибо.
Но как не странно картинка всеравно не отображается, выскакивает фрейм без изображения.
Я пробовал задавать путь к другой картинке, причем другого размера. При этом размер фрейма меняется согласно размеру картинки,
но само изображение не появляется.
Что это может быть?

Автор: w1nd 28.6.2008, 03:00
Цитата(MOFA @  28.6.2008,  00:39 Найти цитируемый пост)
Что это может быть?

А запустите демонстрационный пример из состава JDK - SwingSet. Там с картинками всё в порядке?

Автор: MOFA 28.6.2008, 13:04
Да, там с картинками все в порядке.

Автор: w1nd 29.6.2008, 00:37
А картинку откуда берёте? Это ресурс или внешний файл? В пути к архивам есть восклицательные знаки?

Автор: MOFA 29.6.2008, 13:09
Это внешний файл, я в этом же приложении иконку поднимаю для главного окна.
Иконка нормально отображается. Иконка и эта картинка рядом лежат.

Автор: w1nd 29.6.2008, 16:15
А что за картинка (тип)?

Автор: MOFA 1.7.2008, 23:54
GIF

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)