Я нашел пример в документах 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
Экран заставки можно отобразить при запуске приложения до запуска виртуальной машины 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 возвращает значение 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.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