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