如何更改JFrame图标[重复]

Posted

技术标签:

【中文标题】如何更改JFrame图标[重复]【英文标题】:How to change JFrame icon [duplicate] 【发布时间】:2010-12-09 13:02:25 【问题描述】:

我有一个JFrame,它在标题栏(左角)上显示一个 Java 图标。 我想将该图标更改为我的自定义图标。我该怎么做?

【问题讨论】:

我敢打赌,在大多数情况下,这些人甚至还没有听说过 API。在这种情况下,最好的解决方案可能是提供带有答案的 API 链接。 【参考方案1】:

JFrame.setIconImage(Image image) 非常标准。

【讨论】:

这些解决方案不起作用。【参考方案2】:

像这样创建一个新的ImageIcon 对象:

ImageIcon img = new ImageIcon(pathToFileOnDisk);

然后将其设置为您的JFramesetIconImage()

myFrame.setIconImage(img.getImage());

另外结帐setIconImages() 取而代之的是List

【讨论】:

图标的大小应该是多少?..我现在要创建一个.. 有关大小的有趣讨论请参见此处:coderanch.com/t/343726/Swing-AWT-SWT-JFace/java/… 可能需要不同的大小值:Sizes of frame icons used in Swing 可以使用JFrame的setIconImage()设置标题栏图标,图片必须为.png文件【参考方案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);   
        

    
  

【讨论】:

imgicon.getImage() 是我需要的谢谢【参考方案4】:

这是一个对我有用的替代方案:

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

这与接受的答案非常相似。

【讨论】:

唯一一个回答如果图像是资源如何使用图像的问题。 :D 文件路径示例:图片在“myProject/res” -> getClass().getResource("/myimage.png")(不要忘记前导“/”!)【参考方案5】:

很遗憾,上述解决方案不适用于 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)

【讨论】:

什么是jthon? @otterb Jython 是用 java 实现的 Python【参考方案6】:

只需添加以下代码:

setIconImage(new ImageIcon(PathOfFile).getImage());

【讨论】:

【参考方案7】:

这在我的情况下起到了作用,superthis 在我的课堂上引用了JFrame

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

【讨论】:

在您的情况下,您不需要 super 或 this。你可以忽略它。 也许你是对的,这取决于你的继承设计 如果你扩展你的类,这不是真的必要。 我记得我认为我的内部类具有相同的方法,这使事情变得模棱两可,但你的假设是我同意的默认值 是的,你是对的。这就是为什么我说没有必要,因为如果你不想两个有同名的方法,有时必须这样做^^【参考方案8】:

在构造函数中添加如下代码:

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

将“color.png”更改为要插入的图片的文件名。 将此图片拖放到项目的包中(在 Source Packages 下)。

运行您的项目。

【讨论】:

可以使用JFrame的setIconImage()设置标题栏图标,图片必须为.png文件

以上是关于如何更改JFrame图标[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java如何使用ico图标作为JFrame的图标?

如何更改 Java 程序的 Dock 图标?

如何设置我的jframe的图标,而不用在导出jar时把图标放在桌面上?

如何更改颤振网络应用程序上的图标[重复]

如何在我的应用程序的javafx 2.0中更改阶段标题栏上的图标[重复]

双击图标时关闭JFrame