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
環境) 運行所需圖片:點這里下載
