⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 customdrawnbutton.java

📁 Eclipse 编程技术与实例,讲解了Eclipse编辑器的使用方法
💻 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 + -