Biểu tượng ứng dụng JavaFX


172

Có thể thay đổi biểu tượng ứng dụng bằng JavaFX hay phải thực hiện bằng cách sử dụng Swing?

Câu trả lời:


234

Giả sử giai đoạn của bạn là "giai đoạn" và tệp nằm trong hệ thống tệp:

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

Theo nhận xét bên dưới, nếu nó được bọc trong một bình chứa, bạn sẽ cần sử dụng phương pháp sau:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));

5
Ngoài ra, nếu biểu tượng được cài đặt làm lối tắt ứng dụng và bạn đang sử dụng WebStart làm công nghệ triển khai thì bạn có thể muốn đặt cài đặt biểu tượng / phím tắt / màn hình phù hợp trong tệp jnlp của mình: docs.oracle.com/javase/7 / docs / technotes / guide / javaws /
Mạnh

9
Bạn có thể thêm nhiều hình ảnh có kích thước khác nhau và JavaFX sẽ chọn hình ảnh phù hợp nhất. Bởi vì bạn có kích thước khác nhau trong thanh tác vụ và khác nhau trong thanh tiêu đề.
drzymala

11
Tôi nghĩ rằng điều này chỉ hoạt động khi tệp nằm trong hệ thống tệp, trong trường hợp phổ biến hơn là biểu tượng được bọc bên trong tệp jar và trong đường dẫn lớp, điều này không hoạt động với tôi. Một trong những giải pháp khác sử dụng stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));công trình.
k_o_

3
Xin vui lòng, ít nhất là trên Ubuntu (Unity), biểu tượng chỉ được sử dụng cho trang trí cửa sổ, nhưng không phải cho trình khởi chạy. Để hiển thị biểu tượng (thay vì dấu hỏi xấu xí), bạn cần chỉ định .dektoptệp thích hợp . Xem mô tả của tôi ở đây
dzim

1
biểu tượng này chỉ thay đổi trên thanh tiêu đề tức là phía trên bên trái trên cửa sổ. Làm thế nào để thay đổi biểu tượng của ứng dụng khi nó ở trên màn hình dưới dạng phím tắt? và trên thanh tác vụ?
TejpalBh

74

Tôi đã thử điều này và nó hoàn toàn hoạt động. Mã này là:

stage.getIcons().add(
   new Image(
      <yourclassname>.class.getResourceAsStream( "icon.png" ))); 

icon.png nằm trong cùng thư mục với các tệp nguồn.


3
'<yourgroupname>. class' có thể được thay thế bằng 'getClass ()'
Jim Fred

71

Chương trình đầy đủ cho người mới bắt đầu :) Chương trình này đặt biểu tượng cho StackOverflowIcon.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class StackoverflowIcon extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        // set icon
        stage.getIcons().add(new Image("/path/to/stackoverflow.jpg"));
        stage.setTitle("Wow!! Stackoverflow Icon");
        stage.setScene(new Scene(root, 300, 250));
        stage.show();
    }

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

Đầu ra Screnshot

Ảnh chụp màn hình JavaFX

Đã cập nhật cho JavaFX 8

Không cần thay đổi mã. Nó vẫn hoạt động tốt. Đã thử nghiệm và xác minh trong Java 1.8 (1.8.0_45). Đường dẫn có thể được đặt thành cục bộ hoặc từ xa cả hai đều được hỗ trợ.

stage.getIcons().add(new Image("/path/to/javaicon.png"));

HOẶC LÀ

stage.getIcons().add(new Image("https://example.com/javaicon.png"));

nhập mô tả hình ảnh ở đây

Hy vọng nó giúp. Cảm ơn!!


Điều này có hỗ trợ svg không?
qed

1
@qed, tôi không nghĩ SVG được hỗ trợ, nhưng tôi không chắc chắn 100%. Bạn có thể kiểm tra nó.
Madan Sapkota 04/07/2015

Tôi vừa thử sử dụng tệp .svg cho biểu tượng ứng dụng JavaFX. Nó không hoạt động. Không có lỗi được cung cấp, nhưng JavaFX đã sử dụng logo mặc định của nó thay vì logo tùy chỉnh của tôi.
Simon Diemert

8

bạn có thể thêm nó trong fxml. Cấp độ sân khấu

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>

7

Nếu bạn có một thư mục hình ảnh và biểu tượng được lưu trong đó sử dụng cái này

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/images/comparison.png")));

và nếu bạn đang trực tiếp sử dụng nó từ gói của bạn mà không phải là một thực hành tốt, hãy sử dụng nó

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("comparison.png")));

và nếu bạn có cấu trúc thư mục và bạn có biểu tượng của mình bên trong sử dụng

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("../images/comparison.png")));

2
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));

Nếu icon.png của bạn nằm trong thư mục tài nguyên và nhớ đặt '/' trước nếu không nó sẽ không hoạt động


2

Bạn nghĩ gì về việc tạo gói mới tức là image.icons trong thư mục src của bạn và di chuyển đến đó hình ảnh .png của bạn? Hơn bạn chỉ cần viết:

Image image = new Image("/image/icons/nameOfImage.png");
primaryStage.getIcons().add(image);

Giải pháp này hoàn toàn phù hợp với tôi, nhưng tôi vẫn không chắc liệu nó có đúng không (người mới bắt đầu ở đây).


Nó không phải là thực hành tốt để đặt tài nguyên trong các gói java của bạn. Nên đặt chúng trong resourcesthư mục của bạn .
Thibstars

1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Bạn có thể thêm nhiều biểu tượng với các kích cỡ khác nhau bằng phương pháp này. Hình ảnh phải có kích thước khác nhau của cùng một hình ảnh và kích thước tốt nhất sẽ được chọn. eg. 16x16, 32,32


1
stage.getIcons().add(new Image(ClassLoader.getSystemResourceAsStream("images/icon.png")));

thư mục hình ảnh cần phải có trong thư mục tài nguyên.


4
Câu trả lời này là hoàn toàn không cần thiết vì một câu trả lời khác đã được giải thích tương tự.
L. Guthardt

1

Bạn có thể dễ dàng đặt biểu tượng cho ứng dụng của mình bằng dòng mã này

stage.getIcons (). add (Hình ảnh mới ("đường dẫn hình ảnh"));


0
stage.getIcons().add(new Image("/images/logo_only.png"));

Đó là thói quen tốt để tạo thư mục hình ảnh trong thư mục src của bạn và lấy hình ảnh từ nó.


Câu trả lời này là hoàn toàn không cần thiết vì một câu trả lời khác đã được giải thích tương tự.
L. Guthardt

0

Tôi đã sử dụng điều này trong ứng dụng của tôi

Image icon = new Image(getClass().getResourceAsStream("icon.png"));
window.getIcons().add(icon);

Ở đây cửa sổ là sân khấu.


0

Nếu bạn chạy tệp jar, mã được chỉ định bởi Michael Berry sẽ thay đổi biểu tượng trong thanh tiêu đề và trên thanh tác vụ. Biểu tượng phím tắt không thể thay đổi.

Nếu bạn chạy một chương trình gốc được biên dịch bằng com.zenjava, Bạn phải thêm một liên kết đến biểu tượng chương trình:

<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>8.8.3</version>
    <configuration>
    ...
        <bundleArguments>
            <icon>${project.basedir}/src/main/resources/images/filename.ico</icon>
        </bundleArguments>
    </configuration>
</plugin>

Điều này sẽ thêm một biểu tượng vào phím tắt và thanh tác vụ.


0

Chuyển đổi biểu tượng trong thời gian chạy:

Ngoài các câu trả lời ở đây, tôi thấy rằng một khi bạn đã gán Biểu tượng cho ứng dụng của mình lần đầu tiên, bạn không thể chuyển đổi nó bằng cách chỉ thêm một biểu tượng mới vào giai đoạn của bạn (điều này sẽ hữu ích nếu bạn cần chuyển đổi biểu tượng của bạn ứng dụng bật / tắt bật / tắt).

Để đặt biểu tượng mới trong thời gian chạy, hãy sử dụng getIcons (). Remove (0) trước khi thử thêm biểu tượng mới, trong đó 0 là chỉ mục của biểu tượng bạn muốn ghi đè như được hiển thị ở đây:

//Setting icon by first time (You can do this on your start method).
stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));

//Overriding app icon with a new status (This can be in another method)
stage.getIcons().remove(0);
stage.getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));

Để truy cập vào giai đoạn từ các phương thức hoặc các lớp khác, bạn có thể tạo một trường tĩnh mới cho giai đoạn trong lớp chính của bạn để có thể truy cập nó từ phương thức start () bằng cách gói gọn trong một phương thức tĩnh mà bạn có thể truy cập từ bất kỳ đâu trong ứng dụng của mình .

public class MainApp extends Application {
    private static Stage stage;
    public static Stage getStage() { return stage; }

    @Override public void start(Stage primaryStage) {
        stage = primaryStage
        stage.getIcons().add(new Image(getClass().getResourceAsStream("enabled.png")));
    }
}

public class AnotherClass {
    public void setStageTitle(String newTitle) {
        MainApp.getStage().setTitle(newTitle);
        MainApp.getStage().getIcons().remove(0);
        MainApp.getStage().getIcons().add(new Image(getClass().getResourceAsStream("disabled.png")));
    }
}

-1

Nếu bạn đã Invalid URL or resource not foundđặt icon.png của mình vào thư mục "bin" trong không gian làm việc.


-2

Một cách dễ dàng khác để chèn biểu tượng của riêng bạn vào thanh tiêu đề trong JavaFX là thêm hình ảnh vào giai đoạn chính của bạn bằng phương pháp sau:

Image ico = new Image("resources/images/iconLogo.png");
stage.getIcons().add(ico);

Đảm bảo nhập javafx.scene.image.Image (nếu sử dụng ide như netbeans, việc này sẽ tự động được thực hiện cho bạn).


40
không phải đó chính xác là những gì đã được đăng ở trên?
Xxx

-2

Tôi đã thử điều này và nó hoạt động:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));

trên thực tế, .. không: dấu chấm không được hỗ trợ trong tra cứu tài nguyên, vui lòng đọc tài liệu api
kleopatra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.