Как изменить значок JFrame

У меня есть JFrame, который отображает значок Java в строке заголовка (левый угол). Я хочу изменить этот значок на свой собственный значок. Как я должен это делать?


person Anand    schedule 23.10.2009    source источник
comment
Бьюсь об заклад, что в большинстве случаев эти люди даже не слышали об API. Вероятно, лучшее решение в таких случаях — предоставить ссылку на API с ответом.   -  person Carlos    schedule 25.10.2009


Ответы (8)


Создайте новый объект ImageIcon следующим образом:

ImageIcon img = new ImageIcon(pathToFileOnDisk);

Затем установите его в свой JFrame с помощью setIconImage():

myFrame.setIconImage(img.getImage());

Также проверьте setIconImages()< /a> вместо этого принимает List.

person BFree    schedule 23.10.2009
comment
какой должен быть размер значка?.. я сейчас его создам.. - person Anand; 23.10.2009
comment
Могут потребоваться разные значения размера: Размеры значков фреймов, используемых в Swing - person spongebob; 31.08.2015
comment
Вы можете установить значок заголовка, используя setIconImage() JFrame, и изображение должно быть файлом .png - person Jignesh Gothadiya; 19.01.2020

Вот альтернатива, которая сработала для меня:

yourFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource(Filepath)));

Это очень похоже на принятый ответ.

person Mmir    schedule 18.06.2014
comment
Единственный, который отвечает, как использовать изображение, если это ресурс. :D - person php_coder_3809625; 16.08.2016
comment
Пример пути к файлу: Изображение находится в myProject/res -> getClass().getResource("/myimage.png") (не забудьте начальный /!) - person Neph; 02.10.2019

JFrame.setIconImage(Image image) довольно стандартно.

person Gandalf    schedule 23.10.2009
comment
Эти решения не работают. - person Itchy Nekotorych; 12.05.2013

Вот как я это делаю:

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.io.File;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;



public class MainFrame implements ActionListener{

/**
 * 
 */


/**
 * @param args
 */
public static void main(String[] args) {
    String appdata = System.getenv("APPDATA");
    String iconPath = appdata + "\\JAPP_icon.png";
    File icon = new File(iconPath);

    if(!icon.exists()){
        FileDownloaderNEW fd = new FileDownloaderNEW();
        fd.download("http://icons.iconarchive.com/icons/artua/mac/512/Setting-icon.png", iconPath, false, false);
    }
        JFrame frm = new JFrame("Test");
        ImageIcon imgicon = new ImageIcon(iconPath);
        JButton bttn = new JButton("Kill");
        MainFrame frame = new MainFrame();
        bttn.addActionListener(frame);
        frm.add(bttn);
        frm.setIconImage(imgicon.getImage());
        frm.setSize(100, 100);
        frm.setVisible(true);


}

@Override
public void actionPerformed(ActionEvent e) {
    System.exit(0);

}

}

а вот загрузчик:

import java.awt.GridLayout;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

import java.net.HttpURLConnection;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class FileDownloaderNEW extends JFrame {
  private static final long serialVersionUID = 1L;

  public static void download(String a1, String a2, boolean showUI, boolean exit)
    throws Exception
  {

    String site = a1;
    String filename = a2;
    JFrame frm = new JFrame("Download Progress");
    JProgressBar current = new JProgressBar(0, 100);
    JProgressBar DownloadProg = new JProgressBar(0, 100);
    JLabel downloadSize = new JLabel();
    current.setSize(50, 50);
    current.setValue(43);
    current.setStringPainted(true);
    frm.add(downloadSize);
    frm.add(current);
    frm.add(DownloadProg);
    frm.setVisible(showUI);
    frm.setLayout(new GridLayout(1, 3, 5, 5));
    frm.pack();
    frm.setDefaultCloseOperation(3);
    try
    {
      URL url = new URL(site);
      HttpURLConnection connection = 
        (HttpURLConnection)url.openConnection();
      int filesize = connection.getContentLength();
      float totalDataRead = 0.0F;
      BufferedInputStream in = new      BufferedInputStream(connection.getInputStream());
      FileOutputStream fos = new FileOutputStream(filename);
      BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
      byte[] data = new byte[1024];
      int i = 0;
      while ((i = in.read(data, 0, 1024)) >= 0)
      {
        totalDataRead += i;
        float prog = 100.0F - totalDataRead * 100.0F / filesize;
        DownloadProg.setValue((int)prog);
        bout.write(data, 0, i);
        float Percent = totalDataRead * 100.0F / filesize;
        current.setValue((int)Percent);
        double kbSize = filesize / 1000;

        String unit = "kb";
        double Size;
        if (kbSize > 999.0D) {
          Size = kbSize / 1000.0D;
          unit = "mb";
        } else {
          Size = kbSize;
        }
        downloadSize.setText("Filesize: " + Double.toString(Size) + unit);
      }
      bout.close();
      in.close();
      System.out.println("Took " + System.nanoTime() / 1000000000L / 10000L + "      seconds");
    }
    catch (Exception e)
    {
      JOptionPane.showConfirmDialog(
        null, e.getMessage(), "Error", 
        -1);
    } finally {
        if(exit = true){
            System.exit(128);   
        }

    }
  }
}
person TameHog    schedule 09.06.2013
comment
imgicon.getImage() это то, что мне нужно, спасибо - person shareef; 14.05.2016

Просто добавьте следующий код:

setIconImage(new ImageIcon(PathOfFile).getImage());
person user5984256    schedule 26.02.2016

К сожалению, приведенное выше решение не работает для плагина Jython Fiji. Мне пришлось использовать getProperty для динамического построения относительного пути.

Вот что сработало для меня:

import java.lang.System.getProperty;
import javax.swing.JFrame;
import javax.swing.ImageIcon;

frame = JFrame("Test")
icon = ImageIcon(getProperty('fiji.dir') + '/path/relative2Fiji/icon.png')
frame.setIconImage(icon.getImage());
frame.setVisible(True)
person otterb    schedule 04.03.2015
comment
что такое джтон? @оттерб - person gumuruh; 02.01.2017
comment
Jython — это Python, реализованный с помощью java. - person otterb; 03.01.2017

Это помогло в моем случае super или this относится к JFrame в моем классе

URL url = getClass().getResource("gfx/hi_20px.png");
ImageIcon imgicon = new ImageIcon(url);
super.setIconImage(imgicon.getImage());
person shareef    schedule 14.05.2016
comment
Вам не нужно супер или это в вашем случае. Вы можете оставить это. - person creativecreatorormaybenot; 02.07.2016
comment
может быть, вы правы, это зависит от вашего дизайна наследования - person shareef; 02.07.2016
comment
Если вы расширяете свой класс, в этом нет необходимости. - person creativecreatorormaybenot; 02.07.2016
comment
насколько я помню, я думаю, что у меня были внутренние классы с тем же методом, который делает вещи неоднозначными, но ваше предположение по умолчанию, я согласен - person shareef; 02.07.2016
comment
Да, ты прав. Вот почему я сказал, что это не обязательно, потому что это нужно делать иногда, если вы не хотите, чтобы у двух был метод с одинаковым именем ^^ - person creativecreatorormaybenot; 02.07.2016

Добавьте следующий код в конструктор следующим образом:

public Calculator() {
    initComponents();
//the code to be added        this.setIconImage(newImageIcon(getClass().getResource("color.png")).getImage());     }

Измените «color.png» на имя файла изображения, которое вы хотите вставить. Перетащите это изображение на пакет (в разделе «Исходные пакеты») вашего проекта.

Запустите свой проект.

person Raymond Wachaga    schedule 16.06.2016
comment
Вы можете установить значок заголовка, используя setIconImage() JFrame, и изображение должно быть файлом .png - person Jignesh Gothadiya; 19.01.2020