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(0, 0, size.x, size.y);
} else {
if (hover != null)
gc.fillRectangle(0, 0, 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里面以后, 需要调用一下这个方法. 其实就是添加了监听器, 不然不能正常工作. 这是唯一需要重点注意的地方.
这里说得是更改分割条的颜色, 以及让鼠标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(0, 0, size.x, size.y);
} else {
if (hover != null)
gc.fillRectangle(0, 0, 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);
}
}
}
需要注意的就是hookListener()方法, 当所有的组件都添加到SashForm里面以后, 需要调用一下这个方法. 其实就是添加了监听器, 不然不能正常工作. 这是唯一需要重点注意的地方.
本文介绍了如何在SWT中使用SashForm,并实现分割条颜色自定义及鼠标悬停时变色的功能。通过创建MineSashForm类,添加监听器并覆盖布局方法,实现了对SashForm的美化,包括调整分割条颜色和响应鼠标进入、退出事件。

686

被折叠的 条评论
为什么被折叠?



