I have a JFrame
that displays a Java icon on the title bar (left corner).
I want to change that icon to my custom icon. How should I do it?
-
12I bet that in the most cases those people have not even heard of the API yet. Probably the best solution in cases like this is to provide a link to the API with the answer. – Carlos Oct 24 '09 at 23:54
8 Answers
Create a new ImageIcon
object like this:
ImageIcon img = new ImageIcon(pathToFileOnDisk);
Then set it to your JFrame
with setIconImage()
:
myFrame.setIconImage(img.getImage());
Also checkout setIconImages()
which takes a List
instead.
-
-
3See here for interesting discussion about size: http://www.coderanch.com/t/343726/Swing-AWT-SWT-JFace/java/Frame-s-setIconImage-optimum-image – BFree Oct 23 '09 at 17:24
-
There may be different size values needed: [Sizes of frame icons used in Swing](http://stackoverflow.com/q/18224184/3453226) – spongebob Aug 31 '15 at 16:54
-
1You can set titlebar icon using setIconImage() of JFrame and image must be .png file – Jignesh Gothadiya Jan 19 '20 at 16:52
Here is an Alternative that worked for me:
yourFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource(Filepath)));
It's very similar to the accepted Answer.

- 357
- 3
- 10
-
12The only one which answers how to use the image if it's a resource. :D – php_coder_3809625 Aug 16 '16 at 13:50
-
1Example for the filepath: The image is in "myProject/res" -> `getClass().getResource("/myimage.png")` (don't forget the leading "/"!) – Neph Oct 02 '19 at 09:20
Here is how I do it:
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);
}
}
and here is the downloader:
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);
}
}
}
}

- 950
- 11
- 23
Just add the following code:
setIconImage(new ImageIcon(PathOfFile).getImage());

- 17,953
- 10
- 93
- 108

- 51
- 1
Unfortunately, the above solution did not work for Jython Fiji plugin. I had to use getProperty to construct the relative path dynamically.
Here's what worked for me:
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)

- 31
- 3

- 2,660
- 2
- 29
- 48
This did the trick in my case super
or this
referes to JFrame
in my class
URL url = getClass().getResource("gfx/hi_20px.png");
ImageIcon imgicon = new ImageIcon(url);
super.setIconImage(imgicon.getImage());
-
You don't need the super or this in your case. You can leave it out. – creativecreatorormaybenot Jul 02 '16 at 19:18
-
-
1If you extend your class it is not really necessary. – creativecreatorormaybenot Jul 02 '16 at 19:40
-
as i remember i think i had inner classes with same method which make thing ambigous but yor assumption is the default i agree – shareef Jul 02 '16 at 19:42
-
Yes you are right. That is why I said it's not necessary, because it has to be done sometimes if you wan't two have a method with the same name ^^ – creativecreatorormaybenot Jul 02 '16 at 19:43
Add the following code within the constructor like so:
public Calculator() {
initComponents();
//the code to be added this.setIconImage(newImageIcon(getClass().getResource("color.png")).getImage()); }
Change "color.png" to the file name of the picture you want to insert. Drag and drop this picture onto the package (under Source Packages) of your project.
Run your project.

- 3,310
- 3
- 28
- 31
-
You can set titlebar icon using setIconImage() of JFrame and image must be .png file – Jignesh Gothadiya Jan 19 '20 at 16:51