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

importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Desktop;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.GridLayout;
importjava.awt.color.ColorSpace;
importjava.awt.event.ActionEvent;
importjava.awt.image.BufferedImage;
importjava.awt.image.ColorConvertOp;
importjava.io.IOException;
importjava.net.URI;
importjava.net.URISyntaxException;

importjavax.swing.AbstractAction;
importjavax.swing.BorderFactory;
importjavax.swing.JCheckBox;
importjavax.swing.JComponent;
importjavax.swing.JEditorPane;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.UIManager;
importjavax.swing.WindowConstants;
importjavax.swing.event.HyperlinkEvent;
importjavax.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
*/

publicclassHtmlLableextendsJPanel...{
//内置了本地系统桌面操作支持
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技术中为数不多的亮点之一。
例子如下:
packageorg.loon.test;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Desktop;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.GridLayout;
importjava.awt.color.ColorSpace;
importjava.awt.event.ActionEvent;
importjava.awt.image.BufferedImage;
importjava.awt.image.ColorConvertOp;
importjava.io.IOException;
importjava.net.URI;
importjava.net.URISyntaxException;
importjavax.swing.AbstractAction;
importjavax.swing.BorderFactory;
importjavax.swing.JCheckBox;
importjavax.swing.JComponent;
importjavax.swing.JEditorPane;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.UIManager;
importjavax.swing.WindowConstants;
importjavax.swing.event.HyperlinkEvent;
importjavax.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
*/
publicclassHtmlLableextendsJPanel...{
//内置了本地系统桌面操作支持
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技术中为数不多的亮点之一。
本文介绍如何在Swing中利用HTML标签丰富界面显示效果,包括使用JLabel和JEditorPane展示带链接的文本,并实现不同状态下的样式变化。
409

被折叠的 条评论
为什么被折叠?



