文档章节

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
海淀
程序员
Editor.md v1.5.0 发布,新增黑色主题、支持多行公式等

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

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

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

YouYaX开发者
2014/09/02
4.2K
0
细说Java GUI:AWT,SWT,Swing

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

javasql
2014/02/05
0
2
swtUi4 V3.0 发布,自动化运维

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

tianxia007
2015/10/14
2.8K
10
tianxia007/swtUi4

swtUI4 基于swt,jface等组件封装为一体化的java桌面应用程序框架 从而生成跨平台的可运行,稳定的程序。 服务器自动化运维工具 发布升级日志 2015年10月29日 21:30:39 1.添加java微服务框架...

tianxia007
2015/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
10分钟前
1
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
18分钟前
0
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
28分钟前
15
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
54分钟前
1
0
区块链技术中的那些能商用的企业级应用

WEPOWER是一家立陶宛初创企业,旨在改变可再生电力项目的付费方式。WePower公司创始人Nick Martyniuk表示,政府统一收购价的存在推动了全球风能与太阳能市场的发展。因此,他的公司希望帮助那...

问题终结者
59分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部