SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)

Swing 自定义组件系列-SwingHacks学习笔记(1)


一、自定义JPanel(一个以图像填充的组件)

例1.1 :一个JPanel 的定制子类

ImagePanel.java:


package  org.component;



import  java.awt. * ;
import  javax.swing. * ;

public   class  ImagePanel  extends  JPanel {
    
    
private  Image img;

   
    
public  ImagePanel(Image img) {
        
this .img  =  img;
        Dimension size 
=   new  Dimension(img.getWidth( null ),img.getHeight( null ));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(
null );
    }

    
public   void  paintComponent(Graphics g) {
        g.drawImage(img,
0 , 0 , null );
    }

}


上述构造函数首先会接受等待绘制图像,并将其存入image成员变量,为后面的的程序作准备。然后调用Dimension size = new Dimension(image.getWidth(null),image.getHeight(null));获得图像的的长和宽。之后调用setSize()和setPreferredSize() 来确保面板的大小和图像的大小完全一致。因为子面板不是使用绝对布局(setLayout(null);) 所以必须将面板的首选值,最大和最小值统统设置一遍。


正确设置面板的大小后,就能通过重写paintComponent() 方法绘制图像:


public   void  paintComponent(Graphics g) {
        g.drawImage(img,
0 , 0 , null );
    }

请注意:应当重写paintComponent() 而不是paint(),否则面板中的子组件将无法被绘制。


下面来测试一下我们些的组件:

例1.2测试图像面板:

ImagePanelTest.java


import javax.swing.*;


public class ImagePanelTest {


public static void main(String[] args) {


//ImagePanel panel = new ImagePanel(new ImageIcon("images/background.png").getImage());

ImagePanel panel = new ImagePanel(new ImageIcon(ImagePanelTest.class.getResource("/images/java3d.png")).getImage());


JFrame frame = new JFrame("自定义组件--ImagePanel");

frame.getContentPane().add(panel);

frame.pack();

frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}


注意:如果你写的java 代码是用普通文本编辑器,如Editplus,或NotePad2 之类的并且使用命令行来编译上面的java代码,我建议你用用绿色那一行的代码,把红色的那一行代码注释掉。(其实不注释掉也可以用) 但是如果你用的是NetBeans 或者eclipse 之类的

IDE 那么你最好把用红色部分的代码,因为这是IDE 的资源定位问题,如果用绿色那一行代码运行的结果就会出错,显示的不是你想要看到的结果。不信你试试看就知道了。


运行的结果:(Linux 环境)  运行所需图片:点这里下载






你可能感兴趣的:(SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件))