【问题标题】:Swing : change the icon of jframeSwing : 改变jframe的图标
【发布时间】:2012-09-15 15:56:49
【问题描述】:
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

class Two {
    public static void main(String args[]) throws IOException
    {
        BufferedImage img = ImageIO.read(new File("index.jpg"));
        JFrame frmOne = new JFrame("FACEBOOK");
        frmOne.setIconImage(img);
        frmOne.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frmOne.setVisible(true);
    }
}

在此代码中,显示的是 JPG 图像而不是 JFrame 图标。但是,我想了解BufferedImage img = ImageIO.read(new File("index.jpg")); 行的功能。任何帮助将不胜感激,我是新手。

【问题讨论】:

  • 1) 请查阅 JavaDocs 以获得对这些内容的初步解释。 2) framOne 有一股难闻的气味。永远不应该有framTwo。请参阅The Use of Multiple JFrames, Good/Bad Practice? 3) 该代码在部署时很可能会失败。届时图片将成为嵌入式资源,应通过 URL 访问。 4) 遵守 EDT 的规则!

标签: java swing jframe bufferedimage imageicon


【解决方案1】:

代码BufferedImage img = ImageIO.read(new File("index.jpg"));工作如下:

  1. BufferedImage img = ... 表示该行的其余部分应存储到变量中。

  2. ImageIO.read(... 表示从给定文件中读取图像

  3. new File("index.jpg") 说找到名为"index.jpg"的文件

总的来说,它会从 index.jpg 文件中加载一张图片,并将这张图片存储到 BufferedImage img 中。之后您只需调用 frmOne.setIconImage(img) 即可获取您从文件中读取的图像,并将其设置为框架的图标。

【讨论】:

    【解决方案2】:

    setIconImage 方法会更改显示在JFrame 左上角以及在应用程序之间切换时显示的图像图标。另一种选择是:

    frame.setIconImage(new ImageIcon("filename").getImage());
    

    【讨论】:

      【解决方案3】:

      BufferedImage img = ImageIO.read(new File("index.jpg"));

      分析:

      • BufferedImage img

      这会创建一个名为BufferedImage 的变量img,我们可以将其视为一个对象,其中包含java 显示图像所需的数据,一个BufferedImage as per docs

      BufferedImage 子类描述了具有可访问性的 Image 图像数据的缓冲区。 BufferedImageColorModel 和 图像数据的栅格。

      • ImageIO

      这个类基本上包含了帮助我们读写图像的方法,而不必每次都自己写,As per docs

      包含用于定位的静态便捷方法的类 ImageReadersImageWriters,并执行简单的编码和 解码。

      • read(File input)

      这是ImageIO 内部的public static 方法,因此无需new 关键字即可访问。它允许我们读入我们想要用作Image 的文件的数据,并将它读入的数据返回(因此我们将其保存在一个变量中)为per docs

      返回一个 BufferedImage 作为解码提供的文件的结果 从当前的图像读取器中自动选择的图像读取器 挂号的。该文件被包装在一个 ImageInputStream 中。

      参数: input - 要读取的文件。

      返回:包含输入的解码内容的 BufferedImage,或 null。

      抛出:IllegalArgumentException - 如果输入为空。 IOException - 如果出现错误 在阅读过程中发生。

      • new File(String filename)

      File 类中的非静态方法,因此必须使用新创建的实例 (new) 访问。它允许我们创建对文件的引用,以便我们可以对File 实例执行操作(即读写等)as per docs

      通过转换给定的路径名​​字符串创建一个新的 File 实例 成一个抽象的路径名。如果给定的字符串是空字符串, 那么结果是空的抽象路径名。

      参数:pathname - 一个路径名字符串

      抛出:NullPointerException - 如果路径名参数为空

      现在,当您调用setIconImage(img) 时,我们从文件中读取的所有数据(这是我们的图片并已转换为BufferedImage)将用于将图片显示为JFrames 图标。

      另一种方法是:

      // Create frame
      String title = "Frame Title";
      JFrame frame = new JFrame(title);
      
      // Set icon
      Image icon = Toolkit.getDefaultToolkit().getImage("icon.gif");
      frame.setIconImage(icon);
      

      【讨论】:

        【解决方案4】:

        需要提及的是,您必须处理异常。恕我直言,代码可能最好这样写:

        BufferedImage img = null;  
        
        try {
          img = ImageIO.read(new File("youricon.png"));   // get icon for JFrame
        } catch (IOException e) {
          e.printStackTrace();
        } 
        
        frame.setIconImage(img);                          // set JFrame icon
        

        此外,当您阅读文档时,请注意 .ico 文件不是由 ImageIO() 处理的。使用 .jpg、.png、.bmp 或 .gif 文件。请参阅http://docs.oracle.com/javase/7/docs/api/javax/imageio/package-summary.html 了解更多信息。

        HTH

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 2019-08-08
          相关资源
          最近更新 更多