2013-11-20 86 views
7

我想知道如何在javaFX舞台上设置图标。 我找到了这个方法,但它没有正常工作。在JavaFX舞台上设置图标

stage.getIcons().add(new Image(iconImagePath)); 

stage是javafx.stage.Stage的一个实例,并且我导入了javafx.scene.image.Image。 这是我们收到异常:

无效网址:无效的URL或资源没有找到

另外,有没有错iconImagePath,它的值是“G:/test.jpg” 有是名为test的G驱动器中的jpg文件。另外,当我们使用ImageIO来读取相同的URL时,我们可以轻松完成。

+0

'G:/ test.jpg'不是URL,如果用'file:/ G:/ test.jpg'尝试,会怎么样? – mavroprovato

+1

相关:http://stackoverflow.com/questions/10121991/javafx-2-application-icon/10122335#10122335 – berry120

回答

1

使用

stage.getIcons().add(new Image(("file:logo.png"))); 

,并把图像logo.png在项目的根目录(在同一目录下SRC)

+0

非常感谢,使用这种方法不会引发异常,但舞台的图像图标并没有改变! – Siavash

+0

尝试清理项目并重新构建它不仅运行。 –

+0

你可以发布你的目录结构..? – subash

4

javafx.scene.image.Image的构造函数期待一个URI,而不是一个(完整的)路径。该URI可以是相对的(例如,/images/flower.png)或绝对的(例如file:flower.png)。

G:/test.jpg这样的字符串不是有效的URL,因此是非法的。

改为尝试file:g:/test.jpg

通常情况下,图标应与应用程序捆绑在一起,所以干脆把图像文件到您的类路径(例如,如果你正在使用Eclipse,把它放到你的“src”目录),并使用它像:

stage.getIcons().add(new Image("/logo.jpg")); 
+0

非常感谢,使用这种方法不会引发异常,但舞台的图像图标并没有改变! – Siavash

+0

它没有得到任何异常,这意味着可以找到并加载图像。如果按下Alt + Tab,您应该在窗口的裁剪区域,窗口任务栏和任务列表中看到它。 – isnot2bad

13
stage.getIcons().add(new Image(getClass().getResourceAsStream("bal.png"))); 

这个例子有效。我将一个图标放在与源.java文件相同的文件夹/包中。

目录结构

+0

非常感谢你,使用这种方法不会抛出异常,但舞台的图像图标并没有改变! – Siavash

+0

我的答案已更新。它的工作原理... – subash

+0

再次感谢您,但它不适用于此路径:file:images/pic.jpeg – Siavash

0

这是我做了什么和它的工作。该图像位于我的资源文件夹的根目录中。

stage.getIcons().add(new Image("/ubuntu-mini.png")); 

我使用JavaFX 8

-1

解决的办法是:

File f = new File("image.png"); 
Image ix = new Image(f.toURI().toString()); 
stage.getIcons().add(ix); 
1

不要忘记,你的图标必须在32x3216x16分辨率,如果不是,这是行不通的。

3

最佳途径:

stage.getIcons().add(new Image(getClass().getResource(IconImagePath).toExternalForm())); 
+0

这是一个有点简洁。请解释为什么这个解决方案是“最好的方式”,特别是当已经发布了很多其他答案时。 – APC

+0

这个解决方案是唯一为我工作的解决方案。 – Maxincredible52

1

这里是工作的代码,这是你neened什么。

   import javafx.application.Application; 
       import javafx.event.ActionEvent; 
       import javafx.event.EventHandler; 
       import javafx.scene.Scene; 
       import javafx.scene.control.Button; 
       import javafx.scene.image.Image; 
       import javafx.scene.layout.StackPane; 
       import javafx.stage.Stage; 

       /** 
       * 
       * @author Manikant gautam 
       * This is a beginner's sample application 
       * using JAVAFX 
       * 
       */ 
     public class Helloworld extends Application { 

@Override 
public void start(Stage primaryStage) { 
    Button btn = new Button(); 
    btn.setText("Say 'Hello World'"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      System.out.println("Hello World!"); 
     } 
    }); 

    StackPane root = new StackPane(); 
    root.getChildren().add(btn); 

    Scene scene = new Scene(root, 300, 250); 
    // Set Icon From Here. 
    primaryStage.getIcons().add(
      new Image("/resource/graphics/app_logo.png")); 
    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 


public static void main(String[] args) { 
    launch(args); 
} 

}

//设置图标通过声明

 primaryStage.getIcons().add(
     new Image("/resource/graphics/app_logo.png")); 
+0

我认为这将有助于例子的帮助。而不是放置单行代码。 –

1
// Set the icon 
stage.getIcons().add(new Image(getClass().getResourceAsStream("penguin.png"))); 

我面临同样的问题。我使用Netbeans。我不确定其他IDE的文件夹结构是否有所不同,但我必须将图片放在/ build/classes /(包含JavaFX类文件的包)中。这意味着它不会进入src文件夹。

-1
public class Main extends Application 
{ 
    private static final Logger LOGGER = Logger.getLogger(Main.class); 

    @Override 
    public void start(Stage primaryStage) 
     { 
      try 
       { 
        // BorderPane root = new BorderPane(); 
        BorderPane root = (BorderPane) FXMLLoader 
          .load(getClass().getResource("/org/geeksynergy/view/layout/FrontPageBorder.fxml")); 
        root.setAccessibleText("good"); 

        Scene scene = new Scene(root, 400, 400); 
        scene.getStylesheets().add(getClass() 
          .getResource("/org/geeksynergy/view/cssstyle/application.css").toExternalForm()); 
        primaryStage.setScene(scene); 
        primaryStage.setTitle("AiRJuke"); 
        primaryStage.getIcons().add(new Image("/org/geeksymergy/resource/images/download.png")); 
        primaryStage.show(); 
        AnchorPane personOverview = (AnchorPane) FXMLLoader 
          .load(getClass().getResource("/org/geeksynergy/view/layout/Ui.fxml")); 

        root.setCenter(personOverview); 

        // added this line to save the playlist , when we close 
        // application window 
        Platform.setImplicitExit(false); 

        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() 
         { 
          public void handle(WindowEvent event) 
           { 
            M3UPlayList.defaultSavePlaylist(); 
            Platform.setImplicitExit(true); 
            primaryStage.hide(); 
           } 
         }); 

       } catch (Exception e) 
       { 

        LOGGER.error("Exception while loding application", e); 
       } 
     } 

    public static void main(String[] args) 
     { 
      launch(args); 
     } 
} 
-1

我使用NetBeans 8.2,如果我使用: stage.getIcons()中的addAll(新形象(的getClass()的getResourceAsStream( “家庭icon32.png”)));

我必须把图像放在src目录中。不知道为什么,但只能用这种方式。我试过把它放在build/classes中,但是是负面的。