文档章节

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

鹞之神乐
 鹞之神乐
发布于 2016/04/17 16:32
字数 725
阅读 41
收藏 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
海淀
程序员
私信 提问
Editor.md v1.5.0 发布,新增黑色主题、支持多行公式等

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

叛道
2015/06/09
5.5K
15
牛魔王UI

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

YouYaX开发者
2014/09/02
4.2K
0
swtUi4 V3.0 发布,自动化运维

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

tianxia007
2015/10/14
2.9K
9
细说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.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部