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 环境 )  运行所需图片:点这里下载



你可能感兴趣的:(eclipse,linux,swing,ide,Netbeans)