文档章节

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

鹞之神乐
 鹞之神乐
发布于 2016/04/17 16:32
字数 725
阅读 39
收藏 0
点赞 1
评论 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
swtUi4 V2.0 发布,桌面程序开发框架

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

tianxia007
2015/10/09
2.2K
0
[IBM DW] Zest(Eclipse Visualization Toolkit)开发入门

简介: 本文介绍了如何使用 Eclipse Visualization Toolkit(http://www.eclipse.org/gef/zest/)这个优秀精巧的 Java 图形工具库来进行图形建模工作流的开发应用。通过程序示例由浅入深,让...

红薯
2010/11/14
1K
2
12 个必要的 jQuery 表单插件

Web表单是网站中很常见的Web组件,你用它来收集数据,用户的详细信息等。然而,现有的表单限制很多,功能比较简单,尽管有 HTML5 ,不幸的是,并非所有浏览器都支持它,所以现在我们可以使用...

红薯
2012/03/28
5.6K
8
GUI开发之AWT、SWING、SWT和JFACE的比较

核心提示:AWT Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。在任何一个 Java 运行环境中都可以使用它。 AWT 是一个非常简单的具有有限 GUI 组件、布局管理器和事件的工具包...

AlphaJay
2010/07/23
0
0
SWT、Swing 或 AWT:哪个更适合您?

在为新应用程序选择 GUI 工具包时应该考虑哪些因素? Barry Feigenbaum (feigenba@us.ibm.com), 编程顾问, IBM 本文通过对 Eclipse 的 SWT 和 Java Swing、Abstract Windows Toolkit(AWT)G...

晨曦之光
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
10分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部