何以解忧?唯有Java

其实程序员也懂得浪漫!
posts - 90, comments - 637, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
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 环境)  运行所需图片:点这里下载







评论

# re: SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)  回复  更多评论   

2008-12-12 11:35 by eydp@163.com
学习中,,,,谢谢楼主,希望楼主多提供些netBeans的资料,楼主有什么好的中文资料或是代码能否发一份,谢谢eydp@163.com

# re: SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)  回复  更多评论   

2008-12-12 12:45 by 日月雨林@gmail.com
@eydp@163.com
其实NetBeans官方已经提供了非常多的中文资料了,你有空的话去看看,里面有很多的教程。

# re: SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)  回复  更多评论   

2008-12-24 09:56 by eydp@hotmail.com
好的,谢谢了

# re: SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)  回复  更多评论   

2009-05-25 17:09 by jzy
参照你的
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
解决了一个图像不能scrollable的问题,非常感谢

只有注册用户登录后才能发表评论。


网站导航: