文档章节

SWT自定义美化组件之带行号的文本域

鹞之神乐
 鹞之神乐
发布于 2016/04/17 16:32
字数 725
阅读 39
收藏 0

自己美化的swt文本域组件,支持滚动条,鼠标滚轮,支持显示行号,支持拖拽大小。win10系统下效果图如下:

附代码:

测试类:

package ZFang.Widget;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TextXSline_Test extends Shell {

	public static void main(String args[]) {
		try {
			Display display = Display.getDefault();
			TextXSline_Test shell = new TextXSline_Test(display);
			shell.open();
			shell.layout();
			while (!shell.isDisposed()) {
				if (!display.readAndDispatch()) {
					display.sleep();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the shell.
	 * 
	 * @param display
	 */
	public TextXSline_Test(Display display) {
		super(display, SWT.SHELL_TRIM);
		setLayout(new FillLayout(SWT.HORIZONTAL));

		TextXSline composite = new TextXSline(this, SWT.NONE);
		composite.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 12, SWT.NORMAL));
		createContents();
		composite.getTextObject().setText("");
	}

	/**
	 * Create contents of the shell.
	 */
	protected void createContents() {
		setText("文本域组件测试 - 鹞之神乐");
		setSize(450, 300);

	}

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}

}

组件类:

package ZFang.Widget;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

public class TextXSline extends Composite {
	private Text text;
	Composite Track,Slider;
	/**
	 * Create the composite.
	 * @param parent
	 * @param style
	 */
	public TextXSline(Composite parent, int style) {
		super(parent, style);
		setBackground(SWTResourceManager.getColor(SWT.COLOR_RED));
		Composite composite = new Composite(this, SWT.NONE);
		composite.setLocation(1, 1);
		System.out.println("0000000000000000000000000000000=="+getSize());
		composite.setSize(getSize().x-2, getSize().y-2);
		addControlListener(new ControlAdapter() {
			@Override
			public void controlResized(ControlEvent e) {
				Rectangle c = getBounds();
				c.x=c.y=1;
				c.width-=2;
				c.height-=2;
				composite.setBounds(c);
				Point p = composite.getSize();
				Rectangle pr = composite.getBounds();
				pr.width = 25;
				lineNo.setBounds(pr);
				pr.width = composite.getBounds().width;
//				p.x-=20;
				pr.x+=25;
				pr.width=pr.width-25;
				text.setBounds(pr);
				Rectangle rect = Track.getBounds();
				rect.x=p.x-20;
				rect.height=p.y;
				Track.setBounds(rect);
			}
		});
		
		Track = new Composite(composite, SWT.NONE);
		Track.setBackground(SWTResourceManager.getColor(255, 228, 225));
		Track.setBounds(414, 0, 20, 261);
		Track.setVisible(false);
		
		Slider = new Composite(Track, SWT.NONE);
		Slider.addListener(SWT.MouseMove, listener);
		Slider.addListener(SWT.MouseDown, listener);
		Slider.setBackground(SWTResourceManager.getColor(255, 69, 0));
		Slider.setBounds(0, 0, Track.getSize().x, 200);
		
		text = new Text(composite, SWT.MULTI);
		text.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if (e.keyCode == 97 && e.stateMask == SWT.CTRL) {
					text.selectAll();
				}
			}
		});
		text.setFont(SWTResourceManager.getFont("Microsoft YaHei UI", 12, SWT.NORMAL));
		text.addListener(SWT.MouseWheel, listener2);
		text.addListener(SWT.Modify, listener2);
		text.addControlListener(new ControlAdapter() {
			@Override
			public void controlResized(ControlEvent e) {
				System.out.println(text.getLineCount()*text.getLineHeight()>text.getSize().y?"�?要滚动条":"不需要滚动条");
				try {
					text.setText(text.getText());
				} catch (Exception e1) {
				}
//				System.out.println("TEXT RESIZE");
//				System.out.println("(显示大小)TEXT.SIZE�?"+text.getSize());
//				System.out.println("(真实大小)总行数x行高�?"+text.getLineCount()*text.getLineHeight());
				
			}
		});
		text.setBounds(0, 0, 434, 261);
		
		lineNo = new Text(composite, SWT.READ_ONLY | SWT.MULTI);
		lineNo.setEnabled(false);
		lineNo.setForeground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_DARK_SHADOW));
		lineNo.setBackground(SWTResourceManager.getColor(255, 228, 225));
		lineNo.setText("12");
		lineNo.setBounds(0, 0, 73, 23);
		lineNo.setFont(text.getFont());
//		createContents();
	}
	Listener listener = new Listener() {
	    int startX, startY;
	    public void handleEvent(Event e) {
	        if (e.type == SWT.MouseDown && e.button == 1) {
	            startX = e.x;
	            startY = e.y;
	        }
	        if (e.type == SWT.MouseMove && (e.stateMask & SWT.BUTTON1) != 0) {
	        	Composite c = (Composite)e.widget;
	        	Rectangle rect = c.getBounds();
//	        	rect.x = rect.x+e.x-startX;//X轴运�?
				rect.y = rect.y+e.y-startY;//Y轴运�?
				if (rect.y<=0) {
					rect.y=0;
				}
				if (rect.y>=c.getParent().getSize().y-rect.height) {
					rect.y=c.getParent().getSize().y-rect.height;
				}
				c.setBounds(rect);
				double b = (double)c.getBounds().y/(c.getParent().getSize().y-c.getSize().y);
				int LineCount = text.getLineCount();
				int LineHeight = text.getLineHeight();
				int TopPixel = text.getTopPixel();
				int x = (int) ((LineCount*LineHeight-text.getSize().y)*b)/LineHeight;
				text.setTopIndex(x);
				lineNo.setTopIndex(x);
				System.out.println("缩放比列�?"+(double)c.getBounds().y/(c.getParent().getSize().y-c.getSize().y));
	        }
	    }
	};
	Listener listener2 = new Listener() {
		public void handleEvent(Event e) {
			if (e.type==SWT.MouseWheel) {
				text.setTopIndex(text.getTopIndex()-e.count);
			}
			System.out.println(text.getLineCount()*text.getLineHeight()>text.getSize().y?"�?要滚动条============":"不需要滚动条");
			Track.setVisible(text.getLineCount()*text.getLineHeight()>text.getSize().y?true:false);
			System.out.println("TEXT MODIFY");
			System.out.println("(显示大小)TEXT.SIZE�?"+text.getSize());
			System.out.println("(真实大小)总行数x行高�?"+text.getLineCount()*text.getLineHeight());
			System.out.println("比例:"+(double)text.getLineCount()*text.getLineHeight()/text.getSize().y);
			double d = (double)text.getSize().y/(text.getLineCount()*text.getLineHeight());
			System.out.println(d);
			Rectangle rect = Slider.getBounds();
			rect.height = (int) (Track.getSize().y*d);
			d = (double)text.getTopPixel()/(text.getLineCount()*text.getLineHeight());
			rect.y = (int) ((Track.getSize().y)*d);
//			rect.y = (text.getTopPixel()/(text.getLineCount()*text.getLineHeight()))*(Track.getSize().y-rect.height);
			Slider.setBounds(rect);
			
			//行号
			int LineCount = text.getLineCount();
			System.out.println(LineCount);
			String lines = "";
			for (int i = 1; i < LineCount+1; i++) {
				lines+=i+"\n";
			}
			lineNo.setText(lines);
			lineNo.setTopIndex(text.getTopIndex());
		}
	};
	private Text lineNo;

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}
	public Text getTextObject() {
		return text;
	}

}


© 著作权归作者所有

共有 人打赏支持
鹞之神乐
粉丝 1
博文 8
码字总数 2869
作品 3
海淀
程序员
私信 提问
swtUi4 V3.0 发布,自动化运维

swtUi4 V3.0 发布,自动化运维! 添加:定时数据库自动同步,并扫表归档日志。 swtUi4 是基于 swt,jface 特殊场景还会集成 awt,swing 等组件封装为一体化的 java桌面应用程序框架,定制自己...

tianxia007
2015/10/14
2.8K
10
Editor.md v1.5.0 发布,新增黑色主题、支持多行公式等

v1.5.0 主要更新: 新增:编辑器黑色主题 Dark,改进自定义主题功能(即工具栏、编辑区、预览区可分别设置主题样式); 新增:多行公式支持; 新增:支持非编辑状态下的 ToC 自定义容器; 新...

叛道
2015/06/09
4.9K
15
细说Java GUI:AWT,SWT,Swing

历史 Internet上有许多围绕这一争论的故事。你可能已经听说过它们中的大多数了,其中之一有助于让你理清头绪,让我们就从这里开始,Amy Fowler是Swing阵营的一个倡导者。 回到上个世纪90年代...

javasql
2014/02/05
0
2
swtUi4 V2.0 发布,桌面程序开发框架

swtUi4 V2.0 发布,此版本更新内容如下: 1.自动化运维,支持 Windows 和 Linux 平台,定时自动备份数据库,添加自动化运维功能。 定时任务执行时间约定可配置,热加载部署。 2.重构工程代码...

tianxia007
2015/10/09
2.2K
0
牛魔王UI

牛魔王UI介绍 这是一套完全开源免费的适合网站布局的UI组件集合 并不都是自己原创,而是根据网络上一些好的示例初步整理而成 Css样式并不是重点 更应该注重的是HTML代码的写法规范 牛魔王UI会...

YouYaX开发者
2014/09/02
4.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
12分钟前
1
0
0022-如何永久删除Kafka的Topic

1.问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Topic时报错“already exists”。 2.问题复现...

Hadoop实操
15分钟前
0
0
技术工坊|区块链中的p2p网络(上海)

区块链是一个去中心化的系统,每个节点分布在全球各地,那么节点之间是如何自发地组成网络,又如何进行通信的?区块链中的p2p网络算法与bt下载中的p2p网络有什么区别?11月28日,第29期技术工...

HiBlock
20分钟前
1
0
MySQL性能优化之char、varchar、text的区别

在存储字符串时, 可以使用char、varchar或者text类型, 那么具体使用场景呢? 参考下面这个表结构: 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。 ...

hansonwong
23分钟前
0
0
并发编程系列:4大并发工具类的功能、原理、以及应用场景

一:并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。 2.并发容器 提供各种线程安全...

游人未归
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部