2009-10-23 136 views
87

我有一個JFrame,在標題欄(左上角)顯示Java圖標。 我想將該圖標更改爲我的自定義圖標。我應該怎麼做?如何更改JFrame圖標

+10

我敢打賭,在大多數情況下,這些人甚至還沒有聽說過API。像這樣的情況下,最好的解決方案可能是提供一個鏈接到API與答案。 – Carlos 2009-10-24 23:54:51

回答

130

創建一個新的ImageIcon對象是這樣的:

ImageIcon img = new ImageIcon(pathToFileOnDisk); 

然後將其設置爲你的JFramesetIconImage()

myFrame.setIconImage(img.getImage()); 

也會檢出setIconImages(),這需要List代替。

+0

圖標的大小應該是多少?..我現在要創建一個.. – Anand 2009-10-23 17:18:14

+3

有關尺寸的有趣討論,請點擊此處:http://www.coderanch.com/t/343726/Swing-AWT-SWT-JFace/ java/Frame-s-setIconImage-optimal-image – BFree 2009-10-23 17:24:11

+0

可能需要不同的大小值:[Swing中使用的框架圖標的大小](http://stackoverflow.com/q/18224184/3453226) – 2015-08-31 16:54:01

6

JFrame.setIconImage(Image image)非常標準。

+13

這些解決方案不起作用。 – 2013-05-11 20:26:38

3

這是我如何做到這一點:

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); 
     } 

    } 
    } 
} 
+0

'imgicon。的getImage()'是什麼,我需要感謝 – shareef 2016-05-14 07:55:19

14

這裏是爲我工作的一種選擇:

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

它非常類似於到被接受的答案。

+4

,回答瞭如何使用圖像,如果它是一個資源的唯一一個。 :D – 2016-08-16 13:50:09

3

不幸的是,上面的解決方案並不適用於Jython斐濟插件。我必須使用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) 
+0

什麼是jthon? @otterb – gumuruh 2017-01-02 09:21:23

+0

Jython是Python的與Java – otterb 2017-01-03 09:46:49

1

只需添加以下代碼:

setIconImage(新的ImageIcon(PathOfFile).getImage());

0

這奏效了我的情況superthis referes到JFrame在我的課

URL url = getClass().getResource("gfx/hi_20px.png"); 
ImageIcon imgicon = new ImageIcon(url); 
super.setIconImage(imgicon.getImage()); 
+0

你並不需要在你的情況下,超級本或實施。你可以放棄它。 – creativecreatorormaybenot 2016-07-02 19:18:57

+0

可能你是對的這取決於你的產業設計 – shareef 2016-07-02 19:25:44

+1

如果擴展類是不是真的有必要。 – creativecreatorormaybenot 2016-07-02 19:40:38

0

在構造函數中添加以下代碼,像這樣:

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

更改 「color.png」添加到要插入的圖片的文件名。 將此圖片拖放到項目的包裝(源包裝下)。

運行您的項目。