Ícone do aplicativo JavaFX

172

É possível alterar o ícone do aplicativo usando JavaFX ou precisa ser feito usando o Swing?

Sebb77
fonte

Respostas:

234

Supondo que seu estágio seja "estágio" e o arquivo esteja no sistema de arquivos:

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

Conforme o comentário abaixo, se estiver envolto em um frasco contendo, você precisará usar a seguinte abordagem:

stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("icon.png")));
Michael Berry
fonte
5
Além disso, se o ícone deve ser instalado como um atalho do aplicativo e você estiver usando o WebStart como tecnologia de implantação, convém definir as configurações apropriadas de ícone / atalho / área de trabalho no seu arquivo jnlp
jewelsea 12/12/12
9
Você pode adicionar várias imagens de tamanhos diferentes e o JavaFX escolherá a que melhor se encaixa. Porque você tem tamanhos diferentes na barra de tarefas e diferentes na barra de título.
drzymala
11
Eu acho que isso só funciona quando o arquivo está no sistema de arquivos, para a situação mais comum em que o ícone está dentro do arquivo jar e no caminho da classe, isso não estava funcionando para mim. Uma das outras soluções usando stage.getIcons().add( new Image( <yourclassname>.class.getResourceAsStream( "icon.png" )));obras.
k_o_
3
Por favor, não, que pelo menos no Ubuntu (Unity) o ícone seja usado apenas para a decoração da janela, mas não para o iniciador. Para ter o ícone visível (em vez do ponto de interrogação feio), você precisa especificar o .dektoparquivo apropriado . Veja minha descrição aqui
dzim
1
isso muda apenas o ícone na barra de título, ou seja, no canto superior esquerdo da janela. como alterar o ícone do aplicativo quando está na área de trabalho como atalho? e na barra de tarefas?
precisa saber é o seguinte
74

Eu tentei isso e funciona totalmente. O código é:

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

icon.png está na mesma pasta que os arquivos de origem.

user1736233
fonte
3
'<yourclassname> .class' pode ser substituído por 'getClass ()'
Jim Fred
71

Programa completo para iniciantes :) Este programa define o ícone do 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 de saída

Captura de tela do JavaFX

Atualizado para JavaFX 8

Não há necessidade de alterar o código. Ainda funciona bem. Testado e verificado em Java 1.8 (1.8.0_45). O caminho pode ser definido como local ou remoto, ambos são suportados.

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

OU

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

insira a descrição da imagem aqui

Espero que ajude. Obrigado!!

Madan Sapkota
fonte
Isso suporta svg?
Qed
1
@ qed, não acho que SVG seja suportado, mas não tenho 100% de certeza. Você pode testá-lo.
Madan Sapkota
Eu apenas tentei usar um arquivo .svg para o ícone do aplicativo JavaFX. Não funcionou. Nenhum erro foi fornecido, mas o JavaFX usou seu logotipo padrão em vez do meu logotipo personalizado.
Simon Diemert
8

você pode adicioná-lo em fxml. Nível de estágio

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

Se você possui uma pasta de imagens e o ícone é salvo, use este

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

e se você o estiver usando diretamente do seu pacote, o que não é uma boa prática, use este

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

e se você tiver uma estrutura de pastas e seu ícone dentro desse uso

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

Se o seu icon.png estiver no diretório de recursos e lembre-se de colocar um '/' antes, caso contrário, não funcionará

LazerBanana
fonte
2

O que você acha de criar um novo pacote, por exemplo, image.icons no diretório src e mover para lá as imagens .png? Do que você só precisa escrever:

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

Esta solução funciona perfeitamente para mim, mas ainda não tenho certeza se está correta (iniciante aqui).

Dawid
fonte
Não é uma boa prática colocar recursos em seus pacotes java. É recomendável colocá-los em sua resourcespasta.
Thibstars
1
stage.getIcons().add(new Image(<yourclassname>.class.getResourceAsStream("/icon.png" )));

Você pode adicionar mais de um ícone com tamanhos diferentes usando esse método. As imagens devem ter tamanhos diferentes da mesma imagem e o melhor tamanho será escolhido. eg. 16x16, 32,32

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

pasta de imagens precisa estar na pasta Recurso.

PsyhoZOOM
fonte
4
Essa resposta é completamente desnecessária, pois outra resposta já explicou o mesmo.
L. Guthardt
1

Você pode facilmente colocar o ícone no seu aplicativo usando esta linha de código

stage.getIcons (). add (new Image ("caminho da imagem"));

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

É um bom hábito criar uma pasta de imagens na sua pasta src e obter imagens dela.

Harshad Vaghela
fonte
Essa resposta é completamente desnecessária, pois outra resposta já explicou o mesmo.
L. Guthardt
0

Eu usei isso no meu aplicativo

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

Aqui a janela é o palco.

Moishin
fonte
0

Se você executar o arquivo jar, o código especificado por Michael Berry alterará o ícone na barra de título e na barra de tarefas. O ícone de atalho não pode ser alterado.

Se você executar um programa nativo compilado com com.zenjava, deverá adicionar um link ao ícone do programa:

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

Isso adicionará um ícone ao atalho e barra de tarefas.

Oleksandr Potomkin
fonte
0

Alterne ícones no tempo de execução:

Além das respostas aqui, descobri que depois de atribuir um ícone ao seu aplicativo pela primeira vez, você não pode alterná-lo apenas adicionando um novo ícone ao seu estágio (isso seria útil se você precisar alternar o ícone do seu aplicativo aplicativo ativado / desativado).

Para definir um novo ícone durante o tempo de execução, use o método getIcons (). Remove (0) antes de tentar adicionar um novo ícone, onde 0 é o índice do ícone que você deseja substituir, como é mostrado aqui:

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

Para acessar o estágio a partir de outros métodos ou classes, você pode criar um novo campo estático para o estágio na classe principal, para acessá-lo desde o método start () encapsulando um método estático que você pode acessar de qualquer lugar no seu aplicativo .

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")));
    }
}
Israelense
fonte
-1

Se você Invalid URL or resource not foundcolocou seu icon.png na pasta "bin" no seu espaço de trabalho.

Tim113
fonte
-2

Outra maneira fácil de inserir seu próprio ícone na barra de título no JavaFX é adicionar a imagem ao seu estágio primário usando o seguinte método:

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

Certifique-se de importar javafx.scene.image.Image (se estiver usando um ide como o netbeans, isso deve ser feito automaticamente para você).

Kwesi Aryee
fonte
40
não é exatamente isso que foi postado acima?
XXL
-2

Eu tentei isso e funciona:

stage.getIcons().add(new Image(getClass().getResourceAsStream("../images/icon.png")));
Frank Mmbaga
fonte
na verdade, .. não: os pontos não são suportados na pesquisa de recursos, leia o api doc
kleopatra