在Swing中使用Html标签

在Swing中,有时可能会出现一些较为复杂的样式表现需求,如果单纯通过代码实现,往往得不偿失。这时,我们就可以利用html标签,在组件中得到我们想要的效果。

例子如下:

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>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

public class HtmlLable extends JPanel ... {
//内置了本地系统桌面操作支持
privateDesktopdesktop;

privatestaticfinallongserialVersionUID=1L;

//html内容
privatestaticfinalStringHTML_TEXT="<html><fontcolor='red'><ahref="http://www.helpsoff.com.cn"target="_blank">支持SOFF,插件无罪</a></font>";

publicHtmlLable()...{
super(newBorderLayout());
finalJLabellabel0=newJLabel("普通的JLabel");
finalJLabellabel1=newJLabel(HTML_TEXT);
finalJLabellabel2=newJLabel(HTML_TEXT)...{

privatestaticfinallongserialVersionUID=1L;

//设定Enabled样式
publicvoidsetEnabled(booleanb)...{
super.setEnabled(b);
setForeground(b
?(Color)UIManager.get("Label.foreground")
:(Color)UIManager.get(
"Label.disabledForeground"));
}

}
;
finalJLabellabel3=newJLabel(HTML_TEXT)...{
privatestaticfinallongserialVersionUID=1L;

//阴影
privateBufferedImageshadow;

//设定Enabled样式
publicvoidsetEnabled(booleanb)...{
setForeground(b
?(Color)UIManager.get("Label.foreground")
:(Color)UIManager.get(
"Label.disabledForeground"));
if(!b)...{
BufferedImagesource
=newBufferedImage(getWidth(),
getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2Dg2
=source.createGraphics();
g2.setPaint(
newColor(0,0,0,0));
g2.fillRect(
0,0,getWidth(),getHeight());
paint(g2);
g2.dispose();
ColorConvertOpcolorConvert
=newColorConvertOp(ColorSpace
.getInstance(ColorSpace.CS_GRAY),
null);
shadow
=colorConvert.filter(source,null);
}

super.setEnabled(b);
}


publicvoidpaintComponent(Graphicsg)...{
if(isEnabled())...{
super.paintComponent(g);
}
else...{
if(shadow!=null)
g.drawImage(shadow,
0,0,this);
}

}

}
;

/***//**
*设定为html
*/

finalJEditorPaneeditor1=newMyHtmlEdit("text/html",HTML_TEXT);
editor1.setOpaque(
false);
editor1.setEditable(
false);

finalJEditorPaneeditor2=newMyHtmlEdit("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
=newJPanel(newGridLayout(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
=newJCheckBox("setEnabled",true);
check.setAction(
newAbstractAction("setEnabled")...{
privatestaticfinallongserialVersionUID=1L;

publicvoidactionPerformed(ActionEvente)...{
booleanflag=((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();

}


/***//**
*自定义一个JEditorPane,用以处理html事件
*
*
@authorchenpeng
*
*/

classMyHtmlEditextendsJEditorPaneimplementsHyperlinkListener...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

publicMyHtmlEdit(Stringtype,Stringtext)...{
super(type,text);
addHyperlinkListener(
this);

}


publicvoidhyperlinkUpdate(HyperlinkEvente)...{

if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)...{
try...{
//在本地浏览器中打开uri(jdk1.6后由于强化了awt,就不用再自己写本地浏览器调用了)
desktop.browse(e.getURL().toURI());

}
catch(IOExceptionex)...{
ex.printStackTrace();
}
catch(URISyntaxExceptionex)...{
ex.printStackTrace();
}


}


}

}


/***//**
*创建面板
*
*
@paramtitle
*
@paramlabel
*
@return
*/

privateJPanelmakePanel(Stringtitle,JComponentlabel)...{
JPanelp
=newJPanel(newGridLayout(1,1));
p.setBorder(BorderFactory.createTitledBorder(title));
p.add(label);
returnp;
}


publicstaticvoidmain(String[]args)...{
EventQueue.invokeLater(
newRunnable()...{
publicvoidrun()...{
createGUI();
}

}
);
}


publicstaticvoidcreateGUI()...{

JFrameframe
=newJFrame("在Swing中使用Html标签");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(
newDimension(450,200));

frame.getContentPane().add(
newHtmlLable());

frame.setResizable(
false);
frame.setLocationRelativeTo(
null);
//jdk1.6新项,置顶
frame.setAlwaysOnTop(true);
frame.setVisible(
true);
}


}


效果图:



这时的Swing,既可以实现Swing原有组件功能,也可以接受Html操作,可说是JavaGUI技术中为数不多的亮点之一。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值