国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

JFC/Swing活學活用之創(chuàng)建自定義圖像組件

2019-11-18 11:15:47
字體:
來源:轉載
供稿:網(wǎng)友
下載本文源代碼

  引言

  本文將講述如何應用JFC/Swing內建的圖像組件來創(chuàng)建完全自定義的基于圖像的用戶接口。

  大多數(shù)Swing應用程序是通過標準VM提供的,或者是客戶提供的外觀和感覺(L&F)來獲取它們的外在展示。L&F是一個完整的體系架構,VM需要做很多內在的工作,并且它還不是完全自定義的。舉個例子來說吧,在基于L&F的前提下,我們可以創(chuàng)建一個按鈕,看起來有點像交通崗上的"紅燈",隨之而來的在你的應用中所有的按鈕就都有了這樣的"相貌"。然而有時我們所真正需要的就是一個看起來與圖像完全一樣的按鈕,就像Web上面基于圖像的按鈕一樣。

  為了讓大家更好的了解我們所要介紹的內容,先來看一下最終的顯示效果,如下圖所示:一個帶面板(Panel)的窗格(Frame)包含了一個標簽(Label),一個按鈕(Button),一個復選框(Checkbox)。面板、標簽和按鈕完全由圖像繪制,完全沒有使用到標準的L&F。復選框是一個標準的Checkbox,但它將被設計成是透明的以搭配圖像背景。

JFC/Swing活學活用之創(chuàng)建自定義圖像組件(圖一)



  第一步 創(chuàng)建背景Panel

  要完成這"天堂"般的工程,首先我們要做的是創(chuàng)建一個圖像背景。因為這樣的組件可重用性(reusable)很高,所以我們創(chuàng)建了JPanel類的一個子類,叫做ImagePanel,參考下面的代碼示例:

  示例代碼1:

package com.demo.jcomponents;

import java.awt.*;
import javax.swing.*;

/**
* 創(chuàng)建圖像面板
* @author xiazhi
*/
public class ImagePanel extends JPanel
{
 /**
 * 圖形對象
 */
 PRivate Image img;

 /**
 * 構造函數(shù)
 *
 * @param img 圖像對象
 */
 public ImagePanel(String img)
 {
  this(new ImageIcon(img).getImage());
 }

 /**
 * 構造函數(shù)
 *
 * @param 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);
 }
}
  構造函數(shù)使用Image的實例作為參數(shù),并將繪制的圖像保存在變量img中以備以后使用。接著調用setSize()和setPreferredSize()方法,并以圖像的尺寸作為參數(shù)。這樣可以確保Panel的尺寸與圖像的尺寸完全一致。接下來的操作非常重要,必須顯示地指定Panel的preferred、maximum和minimum尺寸,因為Panel類的父類和子類可能不會使用絕對布局方式。

  小提示:我們都知道,Swing是使用布局治理器(Layout Manager)來控制組件的位置,絕對布局的意思就是不使用布局治理器來控制組件的位置。(可以通過setLayout(null)方法來指定采用絕對布局方式)

  既然這樣,顯示指定的尺寸和位置將會被使用(可以通過setSize()和setLocation()方法)。當使用指定的布局治理器時,preferred,minimum和maximum尺寸可能會被使用。為了適應上面所有的情況,我們只要簡單的設置上面所提及的四個方法就可以了。

  現(xiàn)在,Panel已經(jīng)設置了適當?shù)某叽纾覀兛梢酝ㄟ^重載paintComponent()方法來繪制圖像:

public void paintComponent(Graphics g)
{
 g.drawImage(img, 0, 0, null);
}
  小提示:在這里我們重載了paintComponent()方法,而不是paint()方法,這是很重要的一點,要不然子類將不會被重新繪制。

  現(xiàn)在來測試一下我們工作的成果,我們將自定義的Panel添加到一個Frame中,然后顯示該Frame,參考下面的代碼示例:

  示例代碼2:

package com.demo.jcomponents;

import javax.swing.*;

/**
* 測試圖像Panel組件
* @author xiazhi
*/
public class ImageTest1
{
 public static void main(String[] args)
 {

  ImagePanel panel = new ImagePanel(createImageIcon("images/background.png").getImage());

  JFrame frame = new JFrame("JFC/Swing:創(chuàng)建以圖像為主題的組件");
  frame.getContentPane().add(panel);

  frame.pack();
  frame.setVisible(true);
 }

 protected static ImageIcon createImageIcon(String path)
 {
  java.net.URL imgURL = ImageTest1.class.getResource(path);
  if (imgURL != null)
  {
   return new ImageIcon(imgURL);
  }
  else
  {
   System.err.println("不能找到指定文件: " + path);
   return null;
  }
 }
}
  程序運行后,顯示效果如下:



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉兴市| 谷城县| 镶黄旗| 涟水县| 金乡县| 塘沽区| 文成县| 蒙山县| 恩平市| 吉林省| 玉林市| 青龙| 海城市| 抚顺县| 宜良县| 普定县| 项城市| 慈利县| 琼海市| 门头沟区| 芒康县| 龙井市| 神木县| 呼伦贝尔市| 思茅市| 八宿县| 普安县| 新邵县| 林州市| 曲松县| 达日县| 尼勒克县| 周口市| 定安县| 南汇区| 镶黄旗| 缙云县| 嘉兴市| 伊金霍洛旗| 嘉禾县| 如东县|