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