在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(0, 0, 0, 0));
                    g2.fillRect(0, 0, 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, 0, 0, this);
                }

            }

        }
;

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

        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(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() ...{

        JFrame frame = 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,既可以实现Swing原有组件功能,也可以接受Html操作,可说是JavaGUI技术中为数不多的亮点之一。           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值