在Swing中,有時(shí)可能會(huì)出現(xiàn)一些較為復(fù)雜的樣式表現(xiàn)需求,如果單純通過代碼實(shí)現(xiàn),往往得不償失。這時(shí),我們就可以利用html標(biāo)簽,在組件中得到我們想要的效果。
例子如下:
package
org.loon.test;
import
java.awt.BorderLayout;
import
java.awt.Color;
import
java.awt.Desktop;
import
java.awt.Dimension;
import
java.awt.EventQueue;
import
java.awt.Font;
import
java.awt.Graphics;
import
java.awt.Graphics2D;
import
java.awt.GridLayout;
import
java.awt.color.ColorSpace;
import
java.awt.event.ActionEvent;
import
java.awt.image.BufferedImage;
import
java.awt.image.ColorConvertOp;
import
java.io.IOException;
import
java.net.URI;
import
java.net.URISyntaxException;
import
javax.swing.AbstractAction;
import
javax.swing.BorderFactory;
import
javax.swing.JCheckBox;
import
javax.swing.JComponent;
import
javax.swing.JEditorPane;
import
javax.swing.JFrame;
import
javax.swing.JLabel;
import
javax.swing.JPanel;
import
javax.swing.UIManager;
import
javax.swing.WindowConstants;
import
javax.swing.event.HyperlinkEvent;
import
javax.swing.event.HyperlinkListener;
/**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@author
chenpeng
*@email:ceponline@yahoo.com.cn
*
@version
0.1
*/
public
class
HtmlLable
extends
JPanel
{
//
內(nèi)置了本地系統(tǒng)桌面操作支持
private
Desktopdesktop;
private
static
final
long
serialVersionUID
=
1L
;
//
html內(nèi)容
private
static
final
StringHTML_TEXT
=
"
<html><fontcolor='red'><a>支持SOFF,插件無罪</a></font>
"
;
public
HtmlLable()
{
super
(
new
BorderLayout());
final
JLabellabel0
=
new
JLabel(
"
普通的JLabel
"
);
final
JLabellabel1
=
new
JLabel(HTML_TEXT);
final
JLabellabel2
=
new
JLabel(HTML_TEXT)
{
private
static
final
long
serialVersionUID
=
1L
;
//
設(shè)定Enabled樣式
public
void
setEnabled(
boolean
b)
{
super
.setEnabled(b);
setForeground(b
?
(Color)UIManager.get(
"
Label.foreground
"
)
:(Color)UIManager.get(
"
Label.disabledForeground
"
));
}
}
;
final
JLabellabel3
=
new
JLabel(HTML_TEXT)
{
private
static
final
long
serialVersionUID
=
1L
;
//
陰影
private
BufferedImageshadow;
//
設(shè)定Enabled樣式
public
void
setEnabled(
boolean
b)
{
setForeground(b
?
(Color)UIManager.get(
"
Label.foreground
"
)
:(Color)UIManager.get(
"
Label.disabledForeground
"
));
if
(
!
b)
{
BufferedImagesource
=
new
BufferedImage(getWidth(),
getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2Dg2
=
source.createGraphics();
g2.setPaint(
new
Color(
0
,
0
,
0
,
0
));
g2.fillRect(
0
,
0
,getWidth(),getHeight());
paint(g2);
g2.dispose();
ColorConvertOpcolorConvert
=
new
ColorConvertOp(ColorSpace
.getInstance(ColorSpace.CS_GRAY),
null
);
shadow
=
colorConvert.filter(source,
null
);
}
super
.setEnabled(b);
}
public
void
paintComponent(Graphicsg)
{
if
(isEnabled())
{
super
.paintComponent(g);
}
else
{
if
(shadow
!=
null
)
g.drawImage(shadow,
0
,
0
,
this
);
}
}
}
;
/**
*設(shè)定為html
*/
final
JEditorPaneeditor1
=
new
MyHtmlEdit(
"
text/html
"
,HTML_TEXT);
editor1.setOpaque(
false
);
editor1.setEditable(
false
);
final
JEditorPaneeditor2
=
new
MyHtmlEdit(
"
text/html
"
,HTML_TEXT);
editor2.setOpaque(
false
);
editor2.setEditable(
false
);
editor2.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES,
Boolean.TRUE);
editor2.setFont((Font)UIManager.get(
"
Label.font
"
));
JPanelbox
=
new
JPanel(
new
GridLayout(
2
,
3
));
box.add(makePanel(
"
JLabel
"
,label0));
box.add(makePanel(
"
JLabel+Html
"
,label1));
box.add(makePanel(
"
JLabel+Html+
"
,label2));
box.add(makePanel(
"
JLabel+Html++
"
,label3));
box.add(makePanel(
"
JEditorPane
"
,editor1));
box.add(makePanel(
"
JEditorPane+
"
,editor2));
JCheckBoxcheck
=
new
JCheckBox(
"
setEnabled
"
,
true
);
check.setAction(
new
AbstractAction(
"
setEnabled
"
)
{
private
static
final
long
serialVersionUID
=
1L
;
public
void
actionPerformed(ActionEvente)
{
boolean
flag
=
((JCheckBox)e.getSource()).isSelected();
setVisible(
false
);
label0.setEnabled(flag);
label1.setEnabled(flag);
label2.setEnabled(flag);
label3.setEnabled(flag);
editor1.setEnabled(flag);
editor2.setEnabled(flag);
setVisible(
true
);
}
}
);
add(check,BorderLayout.NORTH);
add(box,BorderLayout.CENTER);
desktop
=
Desktop.getDesktop();
}
/**
*自定義一個(gè)JEditorPane,用以處理html事件
*
*
@author
chenpeng
*
*/
class
MyHtmlEdit
extends
JEditorPane
implements
HyperlinkListener
{
/**
*
*/
private
static
final
long
serialVersionUID
=
1L
;
public
MyHtmlEdit(Stringtype,Stringtext)
{
super
(type,text);
addHyperlinkListener(
this
);
}
public
void
hyperlinkUpdate(HyperlinkEvente)
{
if
(e.getEventType()
==
HyperlinkEvent.EventType.ACTIVATED)
{
try
{
//
在本地瀏覽器中打開uri(jdk1.6后由于強(qiáng)化了awt,就不用再自己寫本地瀏覽器調(diào)用了)
desktop.browse(e.getURL().toURI());
}
catch
(IOExceptionex)
{
ex.printStackTrace();
}
catch
(URISyntaxExceptionex)
{
ex.printStackTrace();
}
}
}
}
/**
*創(chuàng)建面板
*
*
@param
title
*
@param
label
*
@return
*/
private
JPanelmakePanel(Stringtitle,JComponentlabel)
{
JPanelp
=
new
JPanel(
new
GridLayout(
1
,
1
));
p.setBorder(BorderFactory.createTitledBorder(title));
p.add(label);
return
p;
}
public
static
void
main(String[]args)
{
EventQueue.invokeLater(
new
Runnable()
{
public
void
run()
{
createGUI();
}
}
);
}
public
static
void
createGUI()
{
JFrameframe
=
new
JFrame(
"
在Swing中使用Html標(biāo)簽
"
);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(
new
Dimension(
450
,
200
));
frame.getContentPane().add(
new
HtmlLable());
frame.setResizable(
false
);
frame.setLocationRelativeTo(
null
);
//
jdk1.6新項(xiàng),置頂
frame.setAlwaysOnTop(
true
);
frame.setVisible(
true
);
}
}
效果圖:
這時(shí)的Swing,既可以實(shí)現(xiàn)Swing原有組件功能,也可以接受Html操作,可說是JavaGUI技術(shù)中為數(shù)不多的亮點(diǎn)之一。
例子如下:






































































































































































































































效果圖:

這時(shí)的Swing,既可以實(shí)現(xiàn)Swing原有組件功能,也可以接受Html操作,可說是JavaGUI技術(shù)中為數(shù)不多的亮點(diǎn)之一。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
