关于JAVA-Swing的图像和图标

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.*;

public class FontTest
{
          
   
   public static void main(String[] args)
   {
          
   
      EventQueue.invokeLater(() ->
         {
          
   
            var frame = new FontFrame();
            frame.setTitle("Graph Paint");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
         });
   }
}

/**
 * A frame with a text message component.
 */
class FontFrame extends JFrame
{
          
   
   public FontFrame()
   {
          
         
      add(new FontComponent());
      pack();
   }
}


class FontComponent extends JComponent
{
          
   
   private static final int DEFAULT_WIDTH = 1000;
   private static final int DEFAULT_HEIGHT = 1000;

   public void paintComponent(Graphics g)
   {
          
   
      var g2 = (Graphics2D) g;
      Image image = new ImageIcon("src/movie/timg.jpg").getImage();//获取图片资源
	  g2.drawImage(image, 0, 0, null);
   }
   
   public Dimension getPreferredSize() 
   {
          
    
      return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
   }
}

上面的代码藏了不少的语法,我简单分析一下

关于paintComponent

paintComponent()是Component的一个方法,是会自执行的。 如果一个class中有构造函数,则执行顺序是先执行构造函数,再执行这个。

当Swing中的paint方法被调用时,paintComponent、paintBorder、 paintChildren这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。

关于pack与getPreferredSize

发现在该段代码中使用pack时JFrame会自动适应子组件的大小,子组件的大小默认为getPreferredSize设置的数值…

关于pack的文档解释

使此窗口的大小适合其子组件的首选大小和布局。 如果尺寸小于上一次调用setMinimumSize方法规定的最小尺寸,窗口的宽度和高度将自动放大。

关于getImage

此处我使用了src/movie/??.jpg作为图像文件的相对路径.

关于JAVA中的路径中的和/

一般可以认为是/的作用等同于\ 在java中路径一般用/ windows中的路径一般用 linux、unix中的路径一般用/ 所以在java中写windows路径一般用/或将转义一下,就成了

关于上面代码路径的替换

public void paintComponent(Graphics g)
   {
          
   
      var g2 = (Graphics2D) g;
      String path = System.getProperty("user.dir")+"/src/movie/"
      		+ "timg.jpg";
      System.out.print(path);
      Image image = new ImageIcon(path).getImage();//获取图片资源
	  g2.drawImage(image, 0, 0, null);
   }

等价于

public void paintComponent(Graphics g)
   {
          
   
      var g2 = (Graphics2D) g;
      String path = System.getProperty("user.dir")+"\src\movie\"
      		+ "timg.jpg";
      System.out.print(path);
      Image image = new ImageIcon(path).getImage();//获取图片资源
	  g2.drawImage(image, 0, 0, null);
   }

关于System.getProperty(“user.dir”)

System.getProperty()获取指定键指示的系统属性。 user.dir :User’s current working directory 该语句可以获取当前项目的路径,注意在src前还要紧跟一个 / / /.

替换JFrame的图标

替换上面的部分代码

class FontFrame extends JFrame
{
          
   
   public FontFrame()
   {
          
         
	   String path = System.getProperty("user.dir")+"/src/movie/"
	      		+ "11.jpg";
	  setIconImage(new ImageIcon(path).getImage());
      add(new FontComponent());
      pack();
   }
}
经验分享 程序员 微信小程序 职场和发展