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

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

    
private static final long serialVersionUID = 1L;

    
// html内容
    private static final String HTML_TEXT = "<html><font color='red'><a href="http://www.helpsoff.com.cn" target="_blank">支持SOFF,插件无罪</a></font>";

    
public HtmlLable() {
        
super(new BorderLayout());
        
final JLabel label0 = new JLabel("普通的JLabel");
        
final JLabel label1 = new JLabel(HTML_TEXT);
        
final JLabel label2 = 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 JLabel label3 = new JLabel(HTML_TEXT) {
            
private static final long serialVersionUID = 1L;

            
// 阴影
            private BufferedImage shadow;

            
// 设定Enabled样式
            public void setEnabled(boolean b) {
                setForeground(b 
? (Color) UIManager.get("Label.foreground")
                        : (Color) UIManager.get(
"Label.disabledForeground"));
                
if (!b) {
                    BufferedImage source 
= new BufferedImage(getWidth(),
                            getHeight(), BufferedImage.TYPE_INT_ARGB);
                    Graphics2D g2 
= source.createGraphics();
                    g2.setPaint(
new Color(0000));
                    g2.fillRect(
00, getWidth(), getHeight());
                    paint(g2);
                    g2.dispose();
                    ColorConvertOp colorConvert 
= new ColorConvertOp(ColorSpace
                            .getInstance(ColorSpace.CS_GRAY), 
null);
                    shadow 
= colorConvert.filter(source, null);
                }

                
super.setEnabled(b);
            }


            
public void paintComponent(Graphics g) {
                
if (isEnabled()) {
                    
super.paintComponent(g);
                }
 else {
                    
if (shadow != null)
                        g.drawImage(shadow, 
00this);
                }

            }

        }
;

        
/**
         * 设定为html
         
*/

        
final JEditorPane editor1 = new MyHtmlEdit("text/html", HTML_TEXT);
        editor1.setOpaque(
false);
        editor1.setEditable(
false);

        
final JEditorPane editor2 = 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"));

        JPanel box 
= new JPanel(new GridLayout(23));
        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));

        JCheckBox check 
= new JCheckBox("setEnabled"true);
        check.setAction(
new AbstractAction("setEnabled"{
            
private static final long serialVersionUID = 1L;

            
public void actionPerformed(ActionEvent e) {
                
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(String type, String text) {
            
super(type, text);
            addHyperlinkListener(
this);
            
        }


        
public void hyperlinkUpdate(HyperlinkEvent e) {

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


            }


        }

    }


    
/**
     * 创建面板
     * 
     * 
@param title
     * 
@param label
     * 
@return
     
*/

    
private JPanel makePanel(String title, JComponent label) {
        JPanel p 
= new JPanel(new GridLayout(11));
        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() {

        JFrame frame 
= new JFrame("在Swing中使用Html标签");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(
new Dimension(450200));

        frame.getContentPane().add(
new HtmlLable());

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


}


效果图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值