`

SWT可变Link颜色的Link控件的实现

    博客分类:
  • SWT
阅读更多
package study.swt;

import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.Accessible;
import org.eclipse.swt.accessibility.AccessibleControlAdapter;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TypedListener;

/**
 * <b>系统名称:</b>Digital Cinema 心得--SWT 学习与使用<br>
 * <b>技能名称:</b>可变 Link 颜色的 Link 控件<br>
 * <b>处理说明:</b> SWT 中的 Link 控件的 link 颜色只能为蓝色,如果 Link 的背景是深色的话,就会导致 Link 看起来比较费劲。本控件提供了一个 setLinkColor()方法设置 Link 的颜色。<br>
 * <b>变更履历:</b>2007/10/16 MuChunYu Create<br>
 * <br>
 * 
 * @author Mu ChunYu
 * @version 1.0 2007/07/04 初版
 * <p>
 */
public class ColoredLink extends Canvas {

    /** Link 文字 */
    private String text = null;

    /** Link 文字与边框的距离 */
    private static final int INDENT = 3;

    /** 画 Link 的TextLayout */
    private TextLayout layout = null;

    /** Link的颜色 */
    private Color linkColor = null;

    /** 横向的边框 */
    private int hIndent = INDENT;

    /** 纵向的边框 */
    private int vIndent = INDENT;

    /** Link的范围 */
    private Rectangle rect = null;

    /**
     * <b>机能概要:</b> 构造函数。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>调用父类的构造函数
     * <li>初始化TextLayout
     * <li>添加鼠标移动监听器
     * <li>添加鼠标点击监听器
     * </ul>
     * 
     * @param parent 父容器
     * @param style 分格
     * @since 1.0
     * <p>
     */
    public ColoredLink(Composite parent, int style) {
        super(parent, style);

        // 初始化TextLayout
        layout = new TextLayout(getDisplay());
        layout.setOrientation(SWT.RIGHT_TO_LEFT | SWT.CENTER);

        // 添加描画监听器
        addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent event) {
                // 重画
                onPaint(event);
            }
        });

        // 添加鼠标移动监听器
        addMouseMoveListener(new MouseMoveListener() {
            @Override
            public void mouseMove(MouseEvent event) {
                if (rect != null && rect.contains(event.x, event.y)) {
                    
                    setCursor(new Cursor(null, SWT.CURSOR_HAND));
                } else {
                    setCursor(new Cursor(null, SWT.NONE));
                }
            }
        });

        // 添加鼠标点击监听器
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDown(MouseEvent event) {
                if (rect != null && rect.contains(event.x, event.y)) {
                    Event e = new Event();
                    e.widget = ColoredLink.this;
                    notifyListeners(SWT.Selection, e);
                    redraw();
                }
            }
        });

        // 添加改变大小监听器
        addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {
                redraw();
            }
        });

        // 添加焦点监听器
        addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
                ((Canvas) e.getSource()).redraw();
            }
            public void focusLost(FocusEvent e) {
                ((Canvas) e.getSource()).redraw();
            }
        });

        // 添加Tab监听器,处理Tab键
        addTraverseListener(new TraverseListener() {
            public void keyTraversed(TraverseEvent e) {
                if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
                    e.doit = true;
                }
            }
        });

        // 添加键盘监听器,不添加的话控件不能取得焦点
        addListener(SWT.KeyDown, new Listener() {
            public void handleEvent(Event event) {
            }
        });

        // 设定辅助信息
        addAccessibility();
    }

    /**
     * <b>机能概要:</b> 添加鼠标点击监听器。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>添加鼠标点击监听器
     * </ul>
     * 
     * @param listener 监听器
     * @since 1.0
     * <p>
     */
    public void addSelectionListener(SelectionListener listener) {
        checkWidget();
        if (listener == null) {
            SWT.error(SWT.ERROR_NULL_ARGUMENT);
        }
        TypedListener typedListener = new TypedListener(listener);
        addListener(SWT.Selection, typedListener);
        addListener(SWT.DefaultSelection, typedListener);
    }

    /**
     * <b>机能概要:</b> 删除鼠标点击监听器。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>删除鼠标点击监听器
     * </ul>
     * 
     * @param listener 监听器
     * @since 1.0
     * <p>
     */
    public void removeSelectionListener(SelectionListener listener) {
        checkWidget();
        if (listener == null) {
            SWT.error(SWT.ERROR_NULL_ARGUMENT);
        }
        removeListener(SWT.Selection, listener);
    }

    /**
     * <b>机能概要:</b> 设定辅助信息。<br>
     * 不知道具体干吗的,可以不作<br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>设定辅助信息
     * </ul>
     * 
     * @param listener 监听器
     * @since 1.0
     * <p>
     */
    private void addAccessibility() {
        Accessible accessible = getAccessible();
        accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
            @Override
            public void getChildAtPoint(AccessibleControlEvent e) {
                e.childID = ACC.CHILDID_SELF;
            }

            @Override
            public void getChildCount(AccessibleControlEvent e) {
                e.detail = 0;
            }

            @Override
            public void getRole(AccessibleControlEvent e) {
                e.detail = ACC.ROLE_LINK;
            }

            @Override
            public void getLocation(AccessibleControlEvent e) {
                Rectangle location = getBounds();
                if (location != null) {
                    Point pt = toDisplay(new Point(location.x, location.y));
                    e.x = pt.x;
                    e.y = pt.y;
                    e.width = location.width;
                    e.height = location.height;
                }
            }

            @Override
            public void getState(AccessibleControlEvent e) {
                e.detail = ACC.STATE_FOCUSABLE;
                if (isFocusControl()) {
                    e.detail |= ACC.STATE_FOCUSED;
                }
            }

            @Override
            public void getSelection(AccessibleControlEvent e) {
                if (isFocusControl()) {
                    e.childID = ACC.CHILDID_SELF;
                }
            }

            @Override
            public void getFocus(AccessibleControlEvent e) {
                if (isFocusControl()) {
                    e.childID = ACC.CHILDID_SELF;
                }
            }
            
            @Override
            public void getDefaultAction(AccessibleControlEvent e) {
                e.result = SWT.getMessage("SWT_Press");
            }

        });
    }

    /**
     * <b>机能概要:</b> 画Link。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>计算Link文字的位置
     * <li>画Link
     * <li>保存link文字的位置
     * <li>画取得Focus的虚线
     * </ul>
     * 
     * @param event イベント
     * <p>
     */
    void onPaint(PaintEvent event) {
        // 计算Link文字的位置
        Rectangle txtRect = layout.getBounds();
        Rectangle ctlRect = getBounds();
        hIndent = 0;
        vIndent = ctlRect.height - txtRect.height;
        vIndent = (vIndent > 0 ? vIndent : 0) / 2;
        // 画
        layout.draw(event.gc, hIndent, vIndent);
        // 保存link文字的位置
        rect = new Rectangle(hIndent, vIndent, txtRect.width, txtRect.height);

        // 画取得Focus的虚线
        if (isFocusControl()) {
            event.gc.drawFocus(hIndent, vIndent, txtRect.width, txtRect.height);
        }
    }

    /**
     * <b>机能概要:</b> 取得Link的文字。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>取得Link的文字
     * </ul>
     * 
     * @return text Link的文字
     * <p>
     */
    public String getText() {
        return text;
    }

    /**
     * <b>机能概要:</b> 设定Link的文字。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>设定 Link 的文字
     * <li>设定 Link 的文字的风格,下划线和颜色
     * </ul>
     * 
     * @param text Link 的文字
     * <p>
     */
    public void setText(String text) {
        this.text = text;
        layout.setText(this.text);
        TextStyle txtStyle = new TextStyle(null, linkColor, null);
        txtStyle.underline = true;
        layout.setStyle(txtStyle, 0, StringUtils.isEmpty(text) ? 0 : text.length());
    }

    /**
     * <b>机能概要:</b> 设置 Link 的颜色。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>设置 Link 的颜色
     * </ul>
     * 
     * @param linkColor Link 的颜色
     * <p>
     */
    public void setLinkColor(Color linkColor) {
        this.linkColor = linkColor;
    }

    /**
     * <b>机能概要:</b> 计算 Link 的位置。<br>
     * <br>
     * <b>处理流程:</b> <br>
     * <ul>
     * <li>计算Link的位置
     * </ul>
     * 
     * @param wHint 设定大小
     * @param hHint 设定大小
     * @param changed 变更标志
     * @return Point Link 的位置
     * <p>
     */
    @Override
    public Point computeSize(int wHint, int hHint, boolean changed) {
        Rectangle txtRect = getBounds();
        int width = wHint;
        int height = hHint;
        if (wHint != SWT.DEFAULT) {
            width = txtRect.width;
        }
        if (hHint != SWT.DEFAULT) {
            height = txtRect.height;
        }
        return new Point(width + 2, height + 2);
    }
}

三、使用方式
1、添加 Link
        ColoredLink lnkColumn1 = new ColoredLink(cmpColumn1, SWT.NONE);
        lnkColumn1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
        lnkColumn1.setForeground(StyleUtils.getDetailForeground());
        lnkColumn1.setLinkColor(StyleUtils.getLinkForeground());
        lnkColumn1.setText(column);
        lblCert.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            // TODO
        }

 

分享到:
评论

相关推荐

    SWT/JFace 自定义日历控件(可绑定注册到其他控件)

    SWT自带的DateTime控件属实不好用,而且无法绑定到其他控件上。因此自己写一个日历控件用着方便,功能大致如下: 1、日历控件可自定义设置常见的几种日期格式; 2、可以绑定注册到其他控件如:文本框、按钮、标签上...

    swt link类用法

    通过以上分析,我们可以了解到 `ColoredLink` 类是如何实现自定义颜色的 `Link` 控件的,包括其构造过程、关键属性以及如何通过监听器响应用户事件。这种自定义方式为开发者提供了更多的灵活性,可以根据需求定制...

    java swt自定义控件

    SWT使用JNI(Java Native Interface)来实现这一目标,它允许Java代码直接调用操作系统提供的API,从而避免了Java AWT和Swing中的“重量级”组件带来的性能问题。 ### 2. 自定义控件的基础 在SWT中,自定义控件通常...

    SWT中实现shell Canvas Composite等控件的背景透明

    SWT中实现shell Canvas Composite等控件的背景透明

    Java使用SWT JFreeChart控件实现的小游戏.zip

    Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...

    一个SWT日期时间选择控件类

    这个控件类可能是基于SWT的`Combo`或`Composite`组件进行扩展,以实现日期和时间的选择功能。通常,此类控件会包含两个部分:日期选择器和时间选择器,可能通过下拉菜单或者日历视图来展示。用户可以点击选择具体的...

    SWT日期时间选择控件.rar

    6. **可配置性**:开发者可以根据需求调整控件的外观,比如颜色、字体、大小等。 7. **易用性**:通过简单的API调用即可在SWT程序中集成此控件,提供便利的初始化和设置方法。 为了使用这个自定义的日期时间选择...

    SWT 自定义控件

    2. **设计属性**:为控件提供可配置的属性,如行高、颜色列表等。 ```java public void setColorList(Vector&lt;Color&gt; colors) { this.colors = colors; // 更新显示 } public Vector&lt;Color&gt; getColorList() { ...

    SWT控件

    **SWT控件详解** SWT(Standard Widget Toolkit)是由Eclipse基金会开发并维护的一套用于构建图形用户界面(GUI)的开源库,它是Java语言中的一个GUI工具包,主要面向那些希望创建高性能、原生外观的应用程序的...

    SWT Table单元格编辑功能

    ### SWT Table单元格编辑功能详解 在Java图形用户界面(GUI)开发中,SWT...通过以上步骤,我们可以在SWT `Table`控件中实现单元格的编辑功能,使用户能够直接在界面上修改数据,提高了应用的交互性和实用性。

    SWT基础代码涵盖其所有控件

    OCE(Open Component Environment)可能是指开放组件环境,它可能与Eclipse插件系统有关,允许开发者将SWT控件和其他组件集成到一个可扩展的环境中。然而,"oce"标签在SWT上下文中并不常见,可能需要进一步的信息来...

    SWT日期控件

    6. **可定制性**:提供API让开发者可以调整控件样式,如颜色、字体等,以适应整体应用的UI风格。 在实际开发中,集成这样的第三方日期选择器通常包括以下步骤: 1. **引入依赖**:在项目中添加该第三方库的依赖,...

    swt table 实现换行

    根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...

    Draw2D 模拟SWT控件之RadioButton、CheckedBox

    本文将深入探讨如何使用Draw2D模拟SWT中的RadioButton和CheckedBox控件,以及这些控件在实际应用中的作用和实现方式。 首先,RadioButton和CheckedBox是GUI中的两种常见选择控件。RadioButton通常用于提供一组互斥...

    SWT/JFace 控件实例

    SWT控件包括按钮、文本框、列表、表格、树形视图、滚动条、菜单等基本元素,以及更复杂的如日历、颜色选择器等。SWT的优势在于它能充分利用操作系统的图形资源,避免了Java AWT或Swing中常见的“Java Look and Feel...

    SWT 使用 OLE 函数调用com控件的资料

    SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料

    SWT 中嵌入Word 控件应用

    在IT行业中,有时候我们需要在Java应用中集成第三方控件或者组件来实现特定的功能,比如在SWT(Standard Widget Toolkit)环境中嵌入Word编辑器。这篇博客"SWT中嵌入Word控件应用"可能就是讲述如何在Java SWT界面中...

    Draw2D 模拟SWT控件之TextField、TextArea

    通过这样的模拟,开发者可以在没有SWT支持的环境中,或者为了实现特殊视觉效果时,使用Draw2D来构建类似功能的控件。这种技术对于跨平台应用,尤其是嵌入式系统或轻量级应用来说非常有用,因为它们可能无法使用完整...

    SWT 时间控件及执行bat文件

    总的来说,这个示例涵盖了SWT GUI开发、时间选择控件的使用、Java定时任务的实现以及通过批处理文件运行Java应用程序的技巧。通过深入学习和理解这些内容,开发者可以创建出具有复杂交互和定时功能的桌面应用程序。

Global site tag (gtag.js) - Google Analytics