2013-11-20 133 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中,但是是負面的。