swing自制組件(一)
??? 在未來的幾天里,我將持續為大家更新swing的自制組件,全部都含有運行截圖和源代碼。方便大家互相交流。
??? 今天的自制組件是一個仿JLabel組件。可是實現3種樣式的JLabel,實例化非常簡單。基本上和JLabel一樣。
?
?
?
package com.tianlong.framework.component;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
/**
* 富標簽
* @author 翟天龍
* @version V1.0 2011-1-21
*/
public class RichJLabel extends JLabel
{
/** . */
private static final long serialVersionUID = 6726176528338618387L;
/**
* 每個字之間的距離
*/
private int tracking;
/**
* 返回一個簡單輪廓樣式的JLabel
*
* @param text
* 文字
* @param fontSize
* 字體大小
*/
public static RichJLabel getOutlineLabel(String text, float fontSize)
{
return getOutlineLabel(text, 0, Color.WHITE, Color.BLACK, fontSize);
}
/**
* 返回一個簡單輪廓樣式的JLabel
*
* @param text
* 文字
* @param tracking
* 文字間距
* @param fontColor
* 字的顏色
* @param lineColor
* 邊框樣色
* @param fontSize
* 字體大小
* @return
*/
public static RichJLabel getOutlineLabel(String text, int tracking, Color fontColor, Color lineColor, float fontSize)
{
RichJLabel label = new RichJLabel(text, tracking, fontSize);
label.setLeftShadow(1, 1, Color.BLACK);
label.setRightShadow(1, 1, Color.BLACK);
label.setForeground(Color.WHITE);
return label;
}
/**
* 返回一個陰影遮蔽樣式的JLabel
*
* @param text
* 文字
* @param fontSize
* 字體大小
*/
public static RichJLabel getShadowLabel(String text, float fontSize)
{
return getShadowLabel(text, 0, Color.WHITE, Color.GRAY, Color.BLACK, fontSize);
}
/**
* 返回一個陰影遮蔽樣式的JLabel
*
* @param text
* 文字
* @param tracking
* 字間距
* @param fontColor
* 字體顏色
* @param leftColor
* 陰影顏色
* @param rightColor
* 字體側邊顏色
* @param fontSize
* 字體大小
*/
public static RichJLabel getShadowLabel(String text, int tracking, Color fontColor, Color leftColor, Color rightColor, float fontSize)
{
RichJLabel label = new RichJLabel(text, tracking, fontSize);
label.setLeftShadow(2, 2, leftColor);
label.setRightShadow(2, 3, rightColor);
label.setForeground(fontColor);
return label;
}
/**
* 返回一個3D樣式的JLabel
*
* @param text
* 文字
* @param fontSize
* 字體大小
*/
public static RichJLabel get3DLabel(String text, float fontSize)
{
return get3DLabel(text, 0, Color.WHITE, Color.GRAY, fontSize);
}
/**
* 返回一個陰影遮蔽樣式的JLabel
*
* @param text
* 文字
* @param tracking
* 字間距
* @param fontColor
* 字體顏色
* @param sideColor
* 字體側邊顏色
* @param fontSize
* 字體大小
*/
public static RichJLabel get3DLabel(String text, int tracking, Color fontColor, Color sideColor, float fontSize)
{
RichJLabel label = new RichJLabel(text, tracking, fontSize);
label.setLeftShadow(5, 5, sideColor);
label.setRightShadow(-3, -3, sideColor);
label.setForeground(fontColor);
return label;
}
/**
* 構造方法
*
* @param text
* @param tracking
* 每個字之間的距離
*/
private RichJLabel( String text, int tracking, float fontSize )
{
super(text);
this.tracking = tracking;
setFont(getFont().deriveFont(fontSize));
}
private int left_x, left_y, right_x, right_y;
private Color left_color, right_color;
public void setLeftShadow(int x, int y, Color color)
{
left_x = x;
left_y = y;
left_color = color;
}
public void setRightShadow(int x, int y, Color color)
{
right_x = x;
right_y = y;
right_color = color;
}
public Dimension getPreferredSize()
{
String text = getText();
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);
}
public void paintComponent(Graphics g)
{
// 打開文字抗鋸齒
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
char[] chars = getText().toCharArray();
FontMetrics fm = this.getFontMetrics(getFont());
int h = fm.getAscent();
g.setFont(getFont());
int x = 0;
for (int i = 0; i < chars.length; i++)
{
char ch = chars[i];
int w = fm.charWidth(ch) + tracking;
g.setColor(left_color);
g.drawString("" + chars[i], x - left_x, h - left_y);
g.setColor(right_color);
g.drawString("" + chars[i], x + right_x, h + right_y);
g.setColor(getForeground());
g.drawString("" + chars[i], x, h);
x += w;
}
}
public static void main(String[] args)
{
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 1));
panel.add(RichJLabel.getOutlineLabel("顯示為簡單輪廓樣式", 60));
panel.add(RichJLabel.get3DLabel("顯示為3D樣式", 60));
panel.add(RichJLabel.getShadowLabel("顯示為陰影遮蔽樣式", 60));
JDialog frame = new JDialog();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setResizable(false);
frame.add(panel);
frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - frame.getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - frame.getSize().height) / 2);
frame.setVisible(true);
}
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

