`

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` 控件的,包括其构造过程、关键属性以及如何通过监听器响应用户事件。这种自定义方式为开发者提供了更多的灵活性,可以根据需求定制...

    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`组件进行扩展,以实现日期和时间的选择功能。通常,此类控件会包含两个部分:日期选择器和时间选择器,可能通过下拉菜单或者日历视图来展示。用户可以点击选择具体的...

    java swt自定义控件

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

    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 中嵌入Word 控件应用

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

    Draw2D 模拟SWT控件之TextField、TextArea

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

    SWT 时间控件及执行bat文件

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

Global site tag (gtag.js) - Google Analytics