SashForm in SWT

本文介绍了如何在SWT中使用SashForm,并实现分割条颜色自定义及鼠标悬停时变色的功能。通过创建MineSashForm类,添加监听器并覆盖布局方法,实现了对SashForm的美化,包括调整分割条颜色和响应鼠标进入、退出事件。
SashForm其实就是Swing当中的SplitPane, 不过可以一下子加入多个分割, 使用起来应该比Swing的好用一些. 不过没有OneTouchButton. 不过这个功能也比较鸡肋, 没有也罢. 唯一遗憾的是不能将组件缩小到0, 不过也有可能我没有发现. 因为现在的应用不需要缩小到0, 所以就不去深究了.

这里说得是更改分割条的颜色, 以及让鼠标hover的时候变色的做法.  默认的SashForm分割条就是背景色, 我们这里做一些修改. 看代码!

/**
 * Come from Brad.Wu.
 
*/

package brad.mine.plugin.ui.swt;

import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.ui.forms.FormColors;
import org.eclipse.ui.forms.IFormColors;

/**
 * Create at Jan 21, 2008 2:38:50 PM<br>
 * sash form
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class MineSashForm extends SashForm {
    
private ArrayList<Sash> sashes = new ArrayList<Sash>();
    
private Listener listener = new Listener() {
        
public void handleEvent(Event e) {
            
switch (e.type) {
            
case SWT.MouseEnter:
                e.widget.setData(
"hover", Boolean.TRUE); //$NON-NLS-1$
                ((Control) e.widget).redraw();
                
break;
            
case SWT.MouseExit:
                e.widget.setData(
"hover"null); //$NON-NLS-1$
                ((Control) e.widget).redraw();
                
break;
            
case SWT.Paint:
                onSashPaint(e);
                
break;
            
case SWT.Resize:
                hookSashListeners();
                
break;
            }

        }

    }
;
    
private FormColors colors;

    
public MineSashForm(Composite parent, int style, FormColors colors) {
        
super(parent, style);
        
this.colors = colors;
    }


    
public void layout(boolean changed) {
        
super.layout(changed);
        hookSashListeners();
    }


    
public void layout(Control[] children) {
        
super.layout(children);
        hookSashListeners();
    }


    
private void hookSashListeners() {
        purgeSashes();
        Control[] children 
= getChildren();
        
for (int i = 0; i < children.length; i++{
            
if (children[i] instanceof Sash) {
                Sash sash 
= (Sash) children[i];
                
if (sashes.contains(sash))
                    
continue;
                sash.addListener(SWT.Paint, listener);
                sash.addListener(SWT.MouseEnter, listener);
                sash.addListener(SWT.MouseExit, listener);
                sashes.add(sash);
            }

        }

    }


    
private void purgeSashes() {
        
for (Iterator<Sash> iter = sashes.iterator(); iter.hasNext();) {
            Sash sash 
= iter.next();
            
if (sash.isDisposed())
                iter.remove();
        }

    }


    
private void onSashPaint(Event e) {
        Sash sash 
= (Sash) e.widget;
        
boolean vertical = (sash.getStyle() & SWT.VERTICAL) != 0;
        GC gc 
= e.gc;
        Boolean hover 
= (Boolean) sash.getData("hover"); //$NON-NLS-1$
        gc.setBackground(colors.getColor(IFormColors.TB_BG));
        gc.setForeground(colors.getColor(IFormColors.TB_BORDER));
        Point size 
= sash.getSize();
        
if (vertical) {
            
if (hover != null)
                gc.fillRectangle(
00, size.x, size.y);
        }
 else {
            
if (hover != null)
                gc.fillRectangle(
00, size.x, size.y);
        }

    }


    
/**
     * Create at Jan 21, 2008 4:50:12 PM<br>
     * hook listener, after add component into sash, this method must be called.
     
*/

    
public void hookListener() {
        Control[] children 
= getChildren();
        
for (int i = 0; i < children.length; i++{
            
if (children[i] instanceof Sash)
                
continue;
            children[i].addListener(SWT.Resize, listener);
        }

    }

}

代码很简单, 构造里面传入一个FormColors, 这是可以从FormToolkit里面获取的对象, 如果需要指定颜色, 修改一下代码应该也很简单, 不在这里罗唆了.

需要注意的就是hookListener()方法, 当所有的组件都添加到SashForm里面以后, 需要调用一下这个方法. 其实就是添加了监听器, 不然不能正常工作. 这是唯一需要重点注意的地方.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值