📄 customdrawnbutton.java
字号:
package org.test.custom.internal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
* 这是一个简单的按钮控件,用户需要子类化这个类以便创建特定类型的按钮。这个类提供了事件处理。
*/
public abstract class CustomDrawnButton extends Canvas {
private boolean pressed;
private final Display display;
private boolean drawnMouseIn = false;
public CustomDrawnButton(Composite parent, int style) {
super(parent, style);
this.display = getDisplay();
// 注册SWT.Paint事件侦听器
addListener(SWT.Paint, new Listener() {
public void handleEvent(Event event) {
boolean mouseIn = mouseIn();
onPaint(event, pressed && mouseIn);
drawnMouseIn = mouseIn;
}
});
// 注册SWT.MouseDown事件侦听器
addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
if (event.button == 1) {
pressed = true;
redraw();
} else if (event.button == 3
&& (event.stateMask & SWT.BUTTON1) != 0) // chord click
{
pressed = false;
redraw();
}
}
});
// 注册SWT.MouseUp事件侦听器
addListener(SWT.MouseUp, new Listener() {
public void handleEvent(Event event) {
if (pressed && (event.stateMask & SWT.BUTTON1) != 0) {
pressed = false;
if (mouseIn()) {
Event selectionEvent = new Event();
notifyListeners(SWT.Selection, selectionEvent);
}
if (!isDisposed())
redraw();
}
}
});
// 注册SWT.MouseMove事件侦听器
addListener(SWT.MouseMove, new Listener() {
public void handleEvent(Event event) {
if (!pressed)
return;
boolean mouseIn = mouseIn();
if (mouseIn == drawnMouseIn)
return;
redraw();
}
});
}
/**
* 判断光标是否在控件上。
*/
private boolean mouseIn() {
Point p = toControl(display.getCursorLocation());
if (p.x < -1 || p.y < -1)
return false;
Point size = getSize();
return p.x <= size.x + 1 && p.y <= size.y + 1;
}
/**
* 返回控件的首选尺寸,这个尺寸是控件可以恰好显示的范围。
*/
public Point computeSize(int wHint, int hHint, boolean changed) {
checkWidget();
if (wHint == SWT.DEFAULT)
wHint = 0;
if (hHint == SWT.DEFAULT)
hHint = 0;
return new Point(wHint, hHint);
}
public boolean setFocus() {
checkWidget();
return false;
}
public boolean isReparentable() {
checkWidget();
return false;
}
/**
* 在画布上显示控件
*/
protected abstract void onPaint(Event event, boolean pressed);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -