在Swing中使用Html标签

系统 1497 0
在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>
*
*
@author chenpeng
*@email:ceponline@yahoo.com.cn
*
@version 0.1
*/

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

private static final long serialVersionUID = 1L ;

// html内容
private static final StringHTML_TEXT = " <html><fontcolor='red'><ahref="http://www.helpsoff.com.cn"target="_blank">支持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 ;

// 设定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;

// 设定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 );
}

}

}
;

/***/ /**
*设定为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();

}


/***/ /**
*自定义一个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后由于强化了awt,就不用再自己写本地浏览器调用了)
desktop.browse(e.getURL().toURI());

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


}


}

}


/***/ /**
*创建面板
*
*
@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标签 " );
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新项,置顶
frame.setAlwaysOnTop( true );
frame.setVisible(
true );
}


}


效果图:
在Swing中使用Html标签


这时的Swing,既可以实现Swing原有组件功能,也可以接受Html操作,可说是JavaGUI技术中为数不多的亮点之一。

在Swing中使用Html标签


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论