何以解憂?唯有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的問題,非常感謝
          主站蜘蛛池模板: 仙居县| 苏州市| 武宁县| 彭水| 鹿邑县| 永和县| 长白| 鹤岗市| 沾益县| 洪泽县| 团风县| 邵阳县| 兴隆县| 家居| 根河市| 嘉善县| 佳木斯市| 钦州市| 扶风县| 天全县| 固始县| 多伦县| 清水县| 保山市| 新乡县| 疏附县| 稻城县| 阳谷县| 望江县| 卓尼县| 仙桃市| 深水埗区| 佛山市| 河间市| 开阳县| 积石山| 阿拉善盟| 随州市| 沅陵县| 宿迁市| 昌图县|