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

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

JFC/Swing活學活用之JLabel文字魔法

2019-11-18 11:10:30
字體:
供稿:網(wǎng)友
前言

  本文將講述如何借助java 2D的"魔力"來幫助JFC/Swing的JLabel組件創(chuàng)建更加豐富多彩的應(yīng)用。

  JLabel作為JFC/Swing架構(gòu)的基礎(chǔ)組件之一,應(yīng)用非常廣泛。當你想要繪制不可編輯的文本時,JLabel是JFC/Swing提供給我們的唯一選擇。一般來說,改變字體、字號、字體顏色,甚至可以加入圖標。通過在組件中應(yīng)用Html語言,甚至可以加入下劃線等特效。對于大多數(shù)應(yīng)用來說,這已經(jīng)足夠好了。但有時你可能有更進一步的要求,比如你需要下拉陰影效果或浮雕效果的時候?這時標準的JLabel就無能為力了,我們不得不結(jié)合強大的Java 2D應(yīng)用,擴展JLabel的功能,以完成下拉陰影,輪廓線,甚至是3D效果之類的特效。幸運的是,JLabel的良好擴展性,使這一切皆為可能,并很輕易。

  大多數(shù)文字特效都可以通過兩種簡單的方式來完成。第一種,可以通過多次重復(fù)繪制文本,每次一點點偏移或每次不同顏色,來創(chuàng)建類似下拉陰影和浮雕之類的特效。第二種,可以通過調(diào)整單詞中字符的間隔(在文字處理系統(tǒng)中它被稱作字符間隙(tracking))來實現(xiàn)。字符間隙通常被加到字體的缺省間隙之上。因而,字符間隙加1意味著一個單詞中每一個字符之間的間隙都在缺省的基礎(chǔ)上加1。假如將該值賦為0則字符間保持缺省的間隙。

  為了實現(xiàn)上面所描述的功能,我們必須重載JLabel中尺寸相關(guān)和繪制相關(guān)的代碼,在這里我們新建了一個擴展JLabel的類RichJLabel,參考下面的示例代碼:(具體的代碼請參考附錄)

  示例代碼1:

public class RichJLabel extends JLabel
{
 /**
 * 字符間隙
 */
 PRivate int tracking;
 /**
 * 構(gòu)造函數(shù)
 *
 * @param text 文本
 * @param tracking 字符間隙
 */
 public RichJLabel(String text, int tracking)
 {
  super(text);
  this.tracking = tracking;
 }

 // 文本的定位信息
 private int left_x, left_y, right_x, right_y;

 // 文本的顏色信息
 private Color left_color, right_color;

 /**
 * 設(shè)置左陰影
 *
 * @param x 定位信息
 * @param y 定位信息
 * @param color 顏色
 */
 public void setLeftShadow(int x, int y, Color color)
 {
  left_x = x;
  left_y = y;
  left_color = color;
 }

 /**
 * 設(shè)置右陰影
 *
 * @param x 定位信息
 * @param y 定位信息
 * @param color 顏色
 */
 public void setRightShadow(int x, int y, Color color)
 {
  right_x = x;
  right_y = y;
  right_color = color;
 }
}
  RichJLabel擴展了標準的javax.swing.JLabel,并在構(gòu)造函數(shù)中加入了tracking參數(shù)。接下來,它增加了兩個方法用來繪制左陰影和右陰影。這里之所以稱之為陰影是因為它們繪制在主體文本的下面,但它們看起來到底像不像陰影這取決于它的顏色,以及x-和y-的偏移量。

  JLabel自動通知布局治理器它的最佳尺寸依靠于字體的大小。當你加入定制的tracking時,尺寸將會變得不準確,導致JLabel太小以至于容納不下所顯示的字體。對于小字體而言這并不輕易引起人們的注重,但對于一些非凡顯示效果的字體(如廣告字之類的字體被放大,一個字可能會占用半張紙或更多的)而言,我們就不得不想辦法加以改善了。


  所有的Swing組件都通過getPreferredSize()方法返回它的最佳尺寸。通過將返回值適當?shù)恼{(diào)大,使用這個組件的布局治理器會給JLabel預(yù)留出它所需要的額外空間,因此我們可以通過重載該方法來滿足我們非凡的顯示要求,參考下面的代碼片段:

  示例代碼2:

/**
* 獲取最佳尺寸
*/
public Dimension getPreferredSize()
{
 // 獲取JLabel的文本
 String text = getText();
 // 獲取字體相關(guān)信息
 FontMetrics fm = this.getFontMetrics(getFont());

 int w = fm.stringWidth(text);
 w += (text.length() - 1) * tracking;
 w += left_x + right_x;

 int h = fm.getHeight();
 h += left_y + right_y;
 return new Dimension(w, h);
}
  在上面的方法中,getPreferredSize()方法計算的依據(jù)是當前要顯示文本的度量單位。對象FontMetrics包含了獲得當前顯示字體高度和寬度的方法。由于變量tracking已經(jīng)加到了字體原有的tracking屬性中,我們可以增加JLabel的顯示寬度通過將tracking寬度加入每一個字符之間,除了最后一個字符外。代碼w += (text.length() - 1) * tracking就完成了這部分工作。陰影將和原始文字具有相同的尺寸,但它并不與原始文字重合,而是有一定的偏移值(left_x和right_x),這就是前面我們添加設(shè)置偏移植代碼的原因。變量tracking的值僅對字符的水平間距產(chǎn)生影響,所以字符的高度值仍可以通過fontmetrics.getHeight()方法獲得。

  小提示:要想完成陰影的效果,千萬不能忘記偏移植的設(shè)置。

  在完成字體尺寸的設(shè)置后,剩下的工作就是在屏幕上實際繪制我們所要設(shè)置的文本內(nèi)容了。與所有的Swing組件類似,我們需要重載paintComponent()方法(而不是paint()方法),以便于子組件可以正確的繪制。

  下面是paintComponent()方法的一部分:

  示例代碼3:



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤台县| 蛟河市| 汶上县| 启东市| 长武县| 巨鹿县| 水城县| 金阳县| 嵩明县| 堆龙德庆县| 讷河市| 佛山市| 达日县| 江口县| 钟山县| 剑川县| 南通市| 新竹县| 江孜县| 拉萨市| 临海市| 石嘴山市| 锦屏县| 新河县| 上饶市| 乌鲁木齐县| 颍上县| 西乌| 定南县| 天柱县| 曲靖市| 封丘县| 邛崃市| 额敏县| 汉源县| 金乡县| 砀山县| 南丰县| 关岭| 中超| 鄂托克前旗|