在Swing中,有时可能会出现一些较为复杂的样式表现需求,如果单纯通过代码实现,往往得不偿失。这时,我们就可以利用html标签,在组件中得到我们想要的效果。
例子如下:
效果图:
这时的Swing,既可以实现Swing原有组件功能,也可以接受Html操作,可说是JavaGUI技术中为数不多的亮点之一。
例子如下:
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);
}
}
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技术中为数不多的亮点之一。