Изменение изображения SplashScreen с помощью SplashScreen.setImageURL (ссылка);

1

Я нашел пример в документах Oracle о SplashScreen. проблема в этом примере, ссылка используемого здесь изображения передается как аргумент в командной строке. Я пытаюсь изменить код, поэтому ссылка написана внутри, и мне не нужно использовать командную строку.

methode setImageURL(URL imageURL) должен уметь выполнять эту работу для меня, но не принимает мой аргумент (параметр).

Я читал о классе URL, кажется, что ему нужен протокол! протокол, такой как http и ftp? если это так, как должен мой url для файлов на моем компьютере? когда я пытаюсь поместить ссылку с моего компьютера (например: "C:\plash.gif"), он говорит, что illege excape character

Я даже пытался использовать ссылку http для изображения, но он дал мне эту ошибку в строке URL:

non-static method setImageURL(URL) cannot be referenced from a static context

здесь код:

package misc;

import java.awt.*;
import java.awt.event.*;
import java.net.URL;

public class SplashDemo extends Frame implements ActionListener {
    static void renderSplashFrame(Graphics2D g, int frame) {
        final String[] comps = {"foo", "bar", "baz"};
        g.setComposite(AlphaComposite.Clear);
        g.fillRect(120,140,200,40);
        g.setPaintMode();
        g.setColor(Color.BLACK);
        g.drawString("Loading "+comps[(frame/5)%3]+"...", 120, 150);
    }
    public SplashDemo() {
        super("SplashScreen demo");
        setSize(300, 200);
        setLayout(new BorderLayout());
        Menu m1 = new Menu("File");
        MenuItem mi1 = new MenuItem("Exit");
        m1.add(mi1);
        mi1.addActionListener(this);
        this.addWindowListener(closeWindow);

        MenuBar mb = new MenuBar();
        setMenuBar(mb);
        mb.add(m1);
        URL link= new URL("http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/SplashDemoProject/src/misc/images/splash.gif");
        SplashScreen.setImageURL(link);
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }

        Graphics2D g = splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
        for(int i=0; i<100; i++) {
            renderSplashFrame(g, i);
            splash.update();
            try {
                Thread.sleep(90);
            }
            catch(InterruptedException e) {
            }
        }
        splash.close();
        setVisible(true);
        toFront();
    }
    public void actionPerformed(ActionEvent ae) {
        System.exit(0);
    }

    private static WindowListener closeWindow = new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            e.getWindow().dispose();
        }
    };

    public static void main (String args[]) {
        SplashDemo test = new SplashDemo();
    }
}

это результат:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - unreported exception java.net.MalformedURLException; must be caught or declared to be thrown
    at misc.SplashDemo.main(SplashDemo.java:103)
Java Result: 1
BUILD SUCCESSFUL (total time: 4 seconds)

и ничего не происходит.

PS: Я очень новичок в Java, я использую NetBeans IDE 7.2.1

Теги:
netbeans
url
splash-screen

1 ответ

4
Лучший ответ

Экран заставки можно отобразить при запуске приложения до запуска виртуальной машины Java (JVM).

Окно заставки автоматически закрывается, как только первое окно отображается Swing/AWT (может быть также закрыто вручную с использованием Java API, см. Ниже).

Если ваше приложение упаковано в файле jar, вы можете использовать

SplashScreen-Image в файле манифеста, чтобы показать заставку.
Поместите изображение в архив jar и укажите путь в опции.
Путь не должен иметь косой черты. Например, в файле manifest.mf:

 Manifest-Version: 1.0
 Main-Class: Test
 SplashScreen-Image: filename.gif

Класс SplashScreen предоставляет API для управления заставкой. Этот класс может использоваться для

  • закрыть заставку
  • изменить изображение заставки
  • получить представление/размер окна окна заставки
  • краска в заставке.

Его нельзя использовать для создания заставки.

  • Этот класс не может быть создан.
  • Только один экземпляр этого класса может существовать, и его можно получить с помощью статического метода getSplashScreen().

Если заставка приложения не была создана при запуске приложения через опцию командной строки или файла манифеста,

метод getSplashScreen возвращает значение null.

так что не так с вашим кодом?

НЕ

SplashScreen.setImageURL(link);

ОК

splash.setImageURL(link);

неправильная последовательность: установка ImageUrl перед тем, как у вас есть объект всплеска

URL link= new URL("http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/SplashDemoProject/src/misc/images/splash.gif");
        SplashScreen.setImageURL(link);
        final SplashScreen splash = SplashScreen.getSplashScreen();

исправить: получить всплеск, а затем установить ImageUrl

короткая

final SplashScreen splash = SplashScreen.getSplashScreen();
splash.setImageURL(link);

долго с catch MalformedURLException чтобы избавиться от ошибки
MalformedURLException: must be caught

final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash == null) {
       System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
   }
URL link;
   try {
        link = new URL("http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/SplashDemoProject/src/misc/images/splash.gif");
       } catch (MalformedURLException ex) {
            System.out.println("MalformedURLException link:77");
            return;
       }
   try {
            splash.setImageURL(link);
       } catch (NullPointerException | IOException | IllegalStateException ex) {
            System.out.println("NullPointer or IO or IllegalState setImageUrl:85");
            return;
       }

Чтобы узнать разницу между локальным файлом изображения и файлом изображения в Интернете. Я создал локальный синий файл splash.gif.

Суть заключается в следующем.

  • Загружается локальное изображение. (Опция SplashScreen-Image в файле манифеста)

Изображение 174551

Изображение 174551

  • Появится приложение.

Изображение 174551


Чтобы заставить его работать в Netbeans

и не всегда получите ошибку SplashScreen.getSplashScreen() returned null

final SplashScreen splash = SplashScreen.getSplashScreen();
    if (splash == null) {
           System.out.println("SplashScreen.getSplashScreen() returned null");

вы должны сделать следующее.

в свойствах указывается на ваш локальный файл.gif: -splash: src/misc/images/splash.gif

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню