Ikon Aplikasi JavaFX

172

Apakah mungkin untuk mengubah ikon aplikasi menggunakan JavaFX, atau apakah itu harus dilakukan menggunakan Swing?

Sebb77
sumber

Jawaban:

234

Dengan asumsi stage Anda adalah "stage" dan file ada di sistem file:

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

Seperti komentar di bawah ini, jika dibungkus dengan toples yang berisi, Anda harus menggunakan pendekatan berikut:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
sumber
5
Selain itu, jika ikon akan diinstal sebagai pintasan aplikasi dan Anda menggunakan WebStart sebagai teknologi penyebaran maka Anda mungkin ingin mengatur ikon / pintas / pengaturan desktop yang sesuai di file jnlp Anda: docs.oracle.com/javase/7 / docs / technotes / guide / javaws /…
jewelsea
9
Anda dapat menambahkan beberapa gambar dengan ukuran berbeda dan JavaFX akan memilih yang paling cocok. Karena Anda memiliki ukuran yang berbeda di bilah tugas dan bilah judul yang berbeda.
drzymala
11
Saya pikir ini hanya berfungsi ketika file dalam sistem file, untuk situasi yang lebih umum di mana ikon dibungkus di dalam file jar dan di classpath, ini tidak berfungsi untuk saya. Salah satu solusi lain menggunakan stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));karya.
k_o_
3
Tolong jangan, itu setidaknya pada Ubuntu (Unity) ikon hanya digunakan untuk dekorasi jendela, tetapi tidak untuk peluncur. Agar ikon terlihat (alih-alih tanda tanya jelek), Anda harus menentukan .dektopfile yang sesuai . Lihat uraian saya di sini
dzim
1
ini hanya mengubah ikon pada bilah judul yaitu sisi kiri atas di jendela. bagaimana cara mengubah ikon aplikasi saat di desktop sebagai pintasan? dan pada taskbar?
TejpalBh
74

Saya mencoba ini dan itu benar-benar berfungsi. Kode tersebut adalah:

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

icon.png berada di bawah folder yang sama dengan file sumber.

pengguna1736233
sumber
3
'<yourclassname> .class' dapat diganti dengan 'getClass ()'
Jim Fred
71

Program lengkap untuk pemula :) Program ini menetapkan ikon untuk 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);
    }
}

Output Screnshot

Screenshot JavaFX

Diperbarui untuk JavaFX 8

Tidak perlu mengubah kode. Itu masih berfungsi dengan baik. Diuji dan diverifikasi di Java 1.8 (1.8.0_45). Path dapat diatur ke lokal atau jauh keduanya didukung.

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

ATAU

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

masukkan deskripsi gambar di sini

Semoga ini bisa membantu. Terima kasih!!

Madan Sapkota
sumber
Apakah ini mendukung svg?
qed
1
@ Qed, saya tidak berpikir SVG didukung, tapi saya tidak 100% yakin. Anda bisa mengujinya.
Madan Sapkota
Saya baru saja mencoba menggunakan file .svg untuk ikon aplikasi JavaFX. Tidak bekerja. Tidak ada kesalahan yang diberikan, tetapi JavaFX menggunakan logo standarnya alih-alih logo kustom saya.
Simon Diemert
8

Anda dapat menambahkannya di fxml. Tingkat panggung

<icons>
    <Image url="@../../../my_icon.png"/>
</icons>
Dmitrij Krupa
sumber
7

Jika Anda memiliki folder gambar dan ikon disimpan dalam penggunaan ini

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

dan jika Anda langsung menggunakannya dari paket Anda yang bukan praktik yang baik gunakan ini

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

dan jika Anda memiliki struktur folder dan Anda memiliki ikon di dalamnya yang digunakan

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("../images/comparison.png")));
Rahul Singh
sumber
2
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png")));

Jika icon.png Anda berada di dir sumber daya dan ingatlah untuk meletakkan tanda '/' sebelum itu tidak akan berfungsi

LazerBanana
sumber
2

Apa yang Anda pikirkan tentang membuat paket baru yaitu image.icons di direktori src Anda dan memindahkan gambar .png ke sana? Daripada Anda hanya perlu menulis:

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

Solusi ini berfungsi dengan baik untuk saya, tetapi saya masih tidak yakin apakah itu benar (pemula di sini).

Dawid
sumber
Ini bukan praktik yang baik untuk menempatkan sumber daya dalam paket java Anda. Disarankan untuk menempatkannya di resourcesfolder Anda .
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Anda dapat menambahkan lebih dari satu ikon dengan ukuran berbeda menggunakan metode ini. Gambar harus berukuran berbeda dari gambar yang sama dan ukuran terbaik akan dipilih. eg. 16x16, 32,32

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

folder gambar harus di folder Sumber.

PsyhoZOOM
sumber
4
Jawaban ini sama sekali tidak perlu karena jawaban lain sudah menjelaskan hal yang sama.
L. Guthardt
1

Anda dapat dengan mudah menaruh ikon ke aplikasi Anda menggunakan baris kode ini

stage.getIcons (). add (Gambar baru ("jalur gambar"));

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

Merupakan kebiasaan yang baik untuk membuat folder gambar di folder src Anda dan mengambil gambar darinya.

Harshad Vaghela
sumber
Jawaban ini sama sekali tidak perlu karena jawaban lain sudah menjelaskan hal yang sama.
L. Guthardt
0

Saya menggunakan ini dalam aplikasi saya

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

Di sini jendela adalah panggung.

Moishin
sumber
0

Jika Anda menjalankan file jar, kode yang ditentukan oleh Michael Berry akan mengubah ikon di bilah judul dan di bilah tugas. Ikon pintasan tidak dapat diubah.

Jika Anda menjalankan program asli yang dikompilasi dengan com.zenjava, Anda harus menambahkan tautan ke ikon program:

<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>

Ini akan menambahkan ikon ke pintasan dan bilah tugas.

Oleksandr Potomkin
sumber
0

Beralih ikon dalam runtime:

Selain tanggapan di sini, saya menemukan bahwa setelah Anda menetapkan Ikon untuk aplikasi Anda saat pertama kali Anda tidak dapat beralih dengan hanya menambahkan ikon baru ke panggung Anda (ini akan membantu jika Anda perlu beralih ikon ikon Anda aplikasi dari aktif / nonaktif diaktifkan / dinonaktifkan).

Untuk mengatur ikon baru saat run time gunakan getIcons (). Hapus (0) sebelum mencoba menambahkan ikon baru, di mana 0 adalah indeks dari ikon yang ingin Anda timpa seperti ditunjukkan di sini:

//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")));

Untuk mengakses tahap dari metode atau kelas lain, Anda dapat membuat bidang statis baru untuk tahap di kelas utama Anda sehingga dapat mengaksesnya dari awal () metode dengan merangkum metode statis yang dapat Anda akses dari mana saja di aplikasi Anda .

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")));
    }
}
Israel
sumber
-1

Jika Anda Invalid URL or resource not foundmeletakkan icon.png di folder "bin" di ruang kerja Anda.

Tim113
sumber
-2

Cara mudah lain untuk menyisipkan ikon Anda sendiri pada bilah judul di JavaFX adalah menambahkan gambar ke tahap utama Anda menggunakan metode berikut:

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

Pastikan impor javafx.scene.image.Image Anda (jika menggunakan ide seperti netbeans, ini harus dilakukan secara otomatis untuk Anda).

Kwesi Aryee
sumber
40
bukankah itu tepatnya yang telah diposting di atas?
XXL
-2

Saya mencoba ini dan berhasil:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
sumber
sebenarnya, .. tidak: titik tidak didukung dalam pencarian sumber daya, silakan baca api doc
kleopatra