ไอคอนแอปพลิเคชัน JavaFX


172

เป็นไปได้หรือไม่ที่จะเปลี่ยนไอคอนแอปพลิเคชันด้วย JavaFX หรือต้องใช้ Swing หรือไม่

คำตอบ:


234

สมมติว่าสเตจของคุณเป็น "สเตจ" และไฟล์อยู่ในระบบไฟล์:

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

ตามความคิดเห็นด้านล่างหากมันถูกห่อในโถที่มีคุณจะต้องใช้วิธีการดังต่อไปนี้แทน:

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

5
นอกจากนี้หากจะติดตั้งไอคอนเป็นทางลัดไปยังแอปพลิเคชันและคุณใช้ WebStart เป็นเทคโนโลยีการปรับใช้คุณอาจต้องการตั้งค่าไอคอน / ทางลัด / เดสก์ท็อปที่เหมาะสมในไฟล์ jnlp ของคุณ: docs.oracle.com/javase/7 / docs / technotes / ไกด์ / javaws / …
jewelsea

9
คุณสามารถเพิ่มรูปภาพหลายขนาดที่แตกต่างกันและ JavaFX จะเลือกรูปภาพที่เหมาะสมที่สุด เนื่องจากคุณมีขนาดแตกต่างกันในแถบงานและขนาดแตกต่างกันในแถบชื่อเรื่อง
drzymala

11
ฉันคิดว่ามันจะทำงานได้ก็ต่อเมื่อไฟล์อยู่ในระบบไฟล์สำหรับสถานการณ์ทั่วไปที่มีการห่อไอคอนไว้ในไฟล์ jar และใน classpath นี่ไม่ได้ผลสำหรับฉัน หนึ่งในโซลูชันอื่น ๆ ที่ใช้stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));งาน
k_o_

3
โปรดอย่าว่าอย่างน้อยบน Ubuntu (Unity) ไอคอนจะใช้สำหรับการตกแต่งหน้าต่างเท่านั้น แต่ไม่ใช่สำหรับตัวเรียกใช้งาน หากต้องการให้ไอคอนปรากฏ (แทนที่จะเป็นเครื่องหมายคำถามน่าเกลียด) คุณจะต้องระบุ.dektopไฟล์ที่เหมาะสม ดูคำอธิบายของฉันที่นี่
dzim

1
การเปลี่ยนแปลงนี้จะมีเพียงไอคอนบนแถบชื่อเรื่องเช่นด้านซ้ายบนของหน้าต่าง วิธีเปลี่ยนไอคอนของแอปพลิเคชั่นเมื่อมันอยู่บนเดสก์ท็อปเป็นทางลัด และบนแถบงาน?
TejpalBh

74

ฉันลองมันแล้วมันใช้งานได้จริง รหัสคือ:

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

icon.png อยู่ในโฟลเดอร์เดียวกับไฟล์ต้นฉบับ


3
'<yourclassname> .class' สามารถแทนที่ได้ด้วย 'getClass ()'
Jim Fred

71

โปรแกรมเต็มรูปแบบสำหรับ starters :) โปรแกรมนี้ตั้งค่าไอคอนสำหรับ 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);
    }
}

เอาท์พุท Screnshot

ภาพหน้าจอ JavaFX

อัปเดตสำหรับ JavaFX 8

ไม่จำเป็นต้องเปลี่ยนรหัส มันยังใช้งานได้ดี ทดสอบและตรวจสอบใน Java 1.8 (1.8.0_45) สามารถตั้งค่าพา ธ เป็นโลคัลหรือรีโมตทั้งคู่ได้

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

หรือ

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

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่ามันจะช่วย ขอบคุณ !!


สิ่งนี้รองรับ svg หรือไม่
QED

1
@qed ฉันไม่คิดว่า SVG รองรับ แต่ฉันไม่แน่ใจ 100% คุณสามารถทดสอบได้
Madan Sapkota

ฉันเพิ่งลองใช้ไฟล์. svg สำหรับไอคอนแอปพลิเคชัน JavaFX มันไม่ได้ผล. ไม่มีข้อผิดพลาดให้ แต่ JavaFX ใช้โลโก้เริ่มต้นแทนโลโก้ที่กำหนดเองของฉัน
Simon Diemert


7

หากคุณมีโฟลเดอร์รูปภาพและไอคอนจะถูกบันทึกในการใช้งานนี้

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

และหากคุณใช้งานโดยตรงจากแพ็คเกจซึ่งไม่ใช่วิธีปฏิบัติที่ดีให้ใช้สิ่งนี้

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

และถ้าคุณมีโครงสร้างโฟลเดอร์และคุณมีไอคอนของคุณภายในที่ใช้

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

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

หาก icon.png ของคุณอยู่ในแหล่งข้อมูลและอย่าลืมใส่ '/' ก่อนมิฉะนั้นจะไม่ทำงาน


2

คุณคิดอย่างไรเกี่ยวกับการสร้างแพ็คเกจใหม่เช่น image.icons ในไดเรกทอรี src ของคุณและย้ายไปที่นั่น. png images? กว่าที่คุณจะต้องเขียน:

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

วิธีนี้ใช้ได้ผลสำหรับฉันอย่างสมบูรณ์แบบ แต่ถึงอย่างนั้นฉันก็ไม่แน่ใจว่ามันถูกต้องหรือไม่


ไม่ใช่วิธีที่ดีในการวางทรัพยากรในแพ็คเกจ Java ของคุณ ขอแนะนำให้วางไว้ในresourcesโฟลเดอร์ของคุณ
Thibstars

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

คุณสามารถเพิ่มไอคอนได้มากกว่าหนึ่งไอคอนที่มีขนาดแตกต่างกันโดยใช้วิธีนี้รูปภาพควรมีขนาดต่างกันของรูปภาพเดียวกันและจะเลือกขนาดที่ดีที่สุด eg. 16x16, 32,32


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

โฟลเดอร์อิมเมจต้องอยู่ในโฟลเดอร์ทรัพยากร


4
คำตอบนี้ไม่จำเป็นอย่างสมบูรณ์เนื่องจากคำตอบอื่นอธิบายไว้แล้วเหมือนกัน
L. Guthardt

1

คุณสามารถใส่ไอคอนลงในแอปพลิเคชันของคุณได้อย่างง่ายดายโดยใช้บรรทัดโค้ดนี้

stage.getIcons (). เพิ่ม (รูปภาพใหม่ ("เส้นทางภาพ"));


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

มันเป็นนิสัยที่ดีที่จะสร้างโฟลเดอร์รูปภาพในโฟลเดอร์ src ของคุณและรับรูปภาพจากมัน


คำตอบนี้ไม่จำเป็นอย่างสมบูรณ์เพราะคำตอบอื่นแล้วอธิบายเหมือนกัน
L. Guthardt

0

ฉันใช้สิ่งนี้ในแอปพลิเคชันของฉัน

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

หน้าต่างที่นี่คือเวที


0

หากคุณเรียกใช้ไฟล์ jar รหัสที่ระบุโดย Michael Berry จะเปลี่ยนไอคอนในแถบชื่อเรื่องและในทาสก์บาร์ ไอคอนทางลัดไม่สามารถเปลี่ยนแปลงได้

หากคุณรันโปรแกรมเนทีฟที่คอมไพล์ด้วย com.zenjava คุณต้องเพิ่มลิงก์ไปยังไอคอนโปรแกรม:

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

จะเป็นการเพิ่มไอคอนไปยังทางลัดและทาสก์บาร์


0

สลับไอคอนในขณะใช้งานจริง:

นอกเหนือจากคำตอบที่นี่ฉันพบว่าเมื่อคุณกำหนดไอคอนให้กับแอปพลิเคชันของคุณในครั้งแรกที่คุณไม่สามารถสลับได้โดยเพิ่มไอคอนใหม่ไปยังสเตจของคุณ (สิ่งนี้จะเป็นประโยชน์หากคุณต้องการสลับไอคอนของคุณ แอปจากเปิด / ปิดเปิด / ปิดการใช้งาน)

ในการตั้งค่าไอคอนใหม่ในขณะใช้งานให้ใช้ getIcons () ลบ (0) ก่อนที่จะพยายามเพิ่มไอคอนใหม่โดยที่ 0 คือดัชนีของไอคอนที่คุณต้องการแทนที่เช่นนั้นแสดงไว้ที่นี่:

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

ในการเข้าถึงสเตจจากวิธีการหรือคลาสอื่นคุณสามารถสร้างสแตติกฟิลด์ใหม่สำหรับสเตจในคลาสหลักของคุณเพื่อให้สามารถเข้าถึงได้จากเมธอด start () โดยการห่อหุ้มด้วยวิธีสแตติกที่คุณสามารถเข้าถึงได้จากทุกที่ในแอป .

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

หากคุณInvalid URL or resource not foundใส่ icon.png ในโฟลเดอร์ "bin" ในพื้นที่ทำงานของคุณ


-2

อีกวิธีที่ง่ายในการแทรกไอคอนของคุณเองบนแถบชื่อเรื่องใน JavaFX คือการเพิ่มภาพไปยังขั้นตอนหลักของคุณโดยใช้วิธีการต่อไปนี้:

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

ตรวจสอบให้แน่ใจว่าการนำเข้า javafx.scene.image.Image ของคุณ (หากใช้ IDE เช่น netbeans สิ่งนี้ควรทำโดยอัตโนมัติสำหรับคุณ)


40
ไม่ได้ว่าตรงกับสิ่งที่ได้รับการโพสต์ดังกล่าวข้างต้น?
XXL

-2

ฉันลองสิ่งนี้และใช้งานได้:

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

อันที่จริง .. ไม่: จุดไม่ได้รับการสนับสนุนในการค้นหาทรัพยากรโปรดอ่าน api doc
kleopatra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.