java swt 几种布局_实战SWT布局

article/2025/9/14 4:31:30

fortune 阅读(577) 评论(0)  编辑  收藏 所属分类: java技术

2571730c24735a03d557a3c8b1424444.png

标准的SWT布局类FillLayout:在容器中以相同的大小单行或单列的排列组件

RowLayout:以单行或多行的方式使用几个选项(fill,wrap,spacing,justify,type)定制组件的排列方式

GridLayout:类似于swing的GridLayout的方式以格子的方式排列组件

FormLayout(SWT 2.0的新特性):通过定义组件四个边的“粘贴”位置来排列组件,被引用的相对的组件可以父组件,也可以是同一容器中的其它组件。

在SWT中,可以由用户自定义布局类。

在简单的布局中,使用FillLayout和RowLayout也许就够用了,也比较简单。但是通常的布局都比较复杂,而且要求很精确。无论复杂程度如何,都可以由GridLayout或FormLayout来完成。通常GridLayout与FormLayout可以做成同样的效果,但是使用FormLayout更有效,不会像GridLayout产生resize导致的布局错位,也更简单。下面通过一个例子简单介绍FormLayout的使用。

布局效果

formlayout.jpg

布局实施

1.首先定义窗口和它的空白边

Display.getDefault().dispose();  //移去平台核心启动画面

display = new Display();

shell = new Shell(display, SWT.TITLE);

FormLayout layout = new FormLayout();

layout.marginHeight = 10;

layout.marginWidth = 20;

shell.setLayout(layout);

shell.setText("用户登录");

2.创建窗口上的元素,其中下面的两个button由一个使用RowLayout的组件来包容。

name = new Label(shell, SWT.NONE);

name.setText("用户名");

nameText = new Text(shell, SWT.SINGLE | SWT.BORDER);

pass = new Label(shell, SWT.NONE);

pass.setText("密码");

passText = new Text(shell, SWT.SINGLE | SWT.BORDER);

passText.setEchoChar('*');

passText.setTabs(2);

bottom = new Composite(shell, SWT.NONE);

RowLayout rowLayout = new RowLayout();

rowLayout.justify = true;  //justify定义组件在容器中分散开,效果类似于swing的FlowLayout

bottom.setLayout(rowLayout);

3.定义name标签的位置。它的顶边离父组件(窗口shell)的空白边距离是父组件clientArea(除空白边以外的空间)高度(height)的15%,偏移的点数(points)为0。

FormData data = new FormData();

data.top = new FormAttachment(15, 0);

name.setLayoutData(data);

4.定义name文本输入的位置。它的顶边在name标签的中心位置(这不是正确的表达,但程序是这样解释,事实上它的中心位置与name标签在同一条水平线上),左边距name标签的右边有10个点。

data = new FormData();

data.top = new FormAttachment(name, 0, SWT.CENTER);

data.left = new FormAttachment(name, 10, SWT.RIGHT);

nameText.setLayoutData(data);

5.定义pass标签的位置。它的顶边距name标签的底边有10个点数的偏移。

data = new FormData();

data.top = new FormAttachment(name, 10, SWT.BOTTOM);

pass.setLayoutData(data);

6.定义pass文本输入的位置。它的顶边在name标签的中心位置(同上),左边与name文本框的左边对齐。

data = new FormData();

data.top = new FormAttachment(pass, 0, SWT.CENTER);

data.left = new FormAttachment(nameText, 0, SWT.LEFT);

passText.setLayoutData(data);

7.定义bottom组件的位置。它的顶边距pass标签的底边15个点数,左边与pass标签的左边对齐,右边与pass文本输入的右边对齐。

data = new FormData();

data.top = new FormAttachment(pass, 15, SWT.BOTTOM);

data.left = new FormAttachment(pass, 0, SWT.LEFT);

data.right = new FormAttachment(passText, 0, SWT.RIGHT);

bottom.setLayoutData(data);

完整的源码

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.SelectionAdapter;

import org.eclipse.swt.events.SelectionEvent;

import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.swt.layout.FormAttachment;

import org.eclipse.swt.layout.FormData;

import org.eclipse.swt.layout.FormLayout;

import org.eclipse.swt.layout.RowLayout;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Text;

import cn.com.efly.clientframe.core.Hook;

/**

* @author efly

* @version 1.0.0,11/22/02

*/

public final class LoginUI {

private Display display;

private Shell shell;

private Composite bottom;

private Label name;

private Label pass;

private Text nameText;

private Text passText;

private Button ok;

private Button exit;

private Rectangle clientArea;

private RootHook rootHook;

public LoginUI(Hook hook) {

rootHook = (RootHook) hook;

}

/**

* 显示登陆界面

*/

public void show() {

Display.getDefault().dispose();

display = new Display();

clientArea = display.getClientArea();

shell = new Shell(display, SWT.TITLE);

FormLayout layout = new FormLayout();

layout.marginHeight = 10;

layout.marginWidth = 20;

shell.setLayout(layout);

shell.setText("用户登录");

name = new Label(shell, SWT.NONE);

name.setText("用户名");

nameText = new Text(shell, SWT.SINGLE | SWT.BORDER);

pass = new Label(shell, SWT.NONE);

pass.setText("密码");

passText = new Text(shell, SWT.SINGLE | SWT.BORDER);

passText.setEchoChar('*');

passText.setTabs(2);

bottom = new Composite(shell, SWT.NONE);

RowLayout rowLayout = new RowLayout();

rowLayout.justify = true;

bottom.setLayout(rowLayout);

ok = new Button(bottom, SWT.PUSH);

ok.setText("确定");

ok.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent event) {

ok();

}

});

exit = new Button(bottom, SWT.PUSH);

exit.setText("取消");

exit.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent event) {

cancel();

}

});

FormData data = new FormData();

data.top = new FormAttachment(15, 0);

name.setLayoutData(data);

data = new FormData();

data.top = new FormAttachment(name, 0, SWT.CENTER);

data.left = new FormAttachment(name, 10, SWT.RIGHT);

nameText.setLayoutData(data);

data = new FormData();

data.top = new FormAttachment(name, 10, SWT.BOTTOM);

pass.setLayoutData(data);

data = new FormData();

data.top = new FormAttachment(pass, 0, SWT.CENTER);

data.left = new FormAttachment(nameText, 0, SWT.LEFT);

passText.setLayoutData(data);

data = new FormData();

data.top = new FormAttachment(pass, 15, SWT.BOTTOM);

data.left = new FormAttachment(pass, 0, SWT.LEFT);

data.right = new FormAttachment(passText, 0, SWT.RIGHT);

bottom.setLayoutData(data);

shell.pack();

Rectangle shellBounds = shell.getBounds();

shell.setLocation(

(clientArea.width - shellBounds.width) / 2,

(clientArea.height - shellBounds.height) / 2);

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

}

private void dispose() {

display.dispose();

}

private void cancel() {

dispose();

}

private void ok() {

verify();

}

private void verify() {

rootHook.runPlatform();

}

public static void main(String[]){

new LoginUI(null).show();

}

}


http://chatgpt.dhexx.cn/article/ENiAw7vn.shtml

相关文章

【SWT】内容分割线

目标 SWT 容器中画横向直线或竖向直线将容器中的内容分割开来。本文介绍了官方的两个示例,效果图见实践部分。 分析 SWT 中至少由两种方法画直线(横向或纵向) SWT 中的GC可以画直线 这种方法最容易想到,但实现起来比较麻烦&a…

SWT

strock width transform,全称笔画宽度变换,是一种局部的图像算子用于提取字符(letter)的笔画宽度作为图像特征。算法步骤如下: 分成三个部分: - 用canny算子计算梯度及方向 - SWT提取笔画宽度得到字符候选区域&am…

eclipse下搭建SWT图形界面开发环境

什么是SWT 参考:http://www.cppblog.com/baby-fly/archive/2009/10/20/99008.html 用java的人一定都知道AWT和Swing,而SWT(Standard Widget Toolkit)则是由Eclipse项目组织开发的一套完整的图形界面开发包,虽然当初仅仅是IBM为了编写Eclipse的…

SWT布局(Layouts)

每种类型操作系统对屏幕的定义不一样,在开发跨平台应用软件时,我们一般都会使用布局(Layout)来管理复合控件(Composite)中子控件的位置和大小。通过布局,程序员可以充分展示那些埋没已久的艺术细…

SWT简介

SWT简介 1. 为什么要使用SWT?  SWT是一个IBM开发的跨平台GUI开发工具包。在SWT之前,Sun已经提供了一个跨平台GUI开发工具包AWT (Abstract Windowing Toolkit)。虽然AWT框架也使用的是原生窗口部件(native widgets),但是它一直未能突破LCD问题。LCD问…

[转]实时股票数据接口大全

from: http://www.21andy.com/blog/20090530/1313.html 实时股票数据接口大全 股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据 1.1Sina股票数据接口 以大秦铁路(股票代码:…

股票数据在线获取

推荐:使用如下地址注册tushare并分享此链接。 https://tushare.pro/register?reg133232 分享此链接,注册tushare. 以前是使用tushare等下载保存到本地数据库后进行计算分析。 现在不想维护本地数据库,想使用时直接在线获取数据。经查找如…

获取股票实时交易数据的方法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 获取股票实时交易数据的方法 注:本文为原创文章,转载时请注明转载地址。炒股有一段时间…

实时股票数据接口 (转,以防有用)

 http://blog.sina.com.cn/s/blog_510844b70102wrvf.html 实时股票数据接口 股票数据的获取目前有如下两种方法可以获取: 1. http/javascript接口取数据 2. web-service接口 1.http/javascript接口取数据1.1Sina股票数据接口 以大秦铁路(…

获取股票数据【实时更新股票数据、创建你的股票数据】、计算交易指标【买入、卖出信号、计算持仓收益、计算累计收益率】

在上一次获取股票数据【使用JQData查询行情数据、财务指标、估值指标】学习了使用JQData来查询股票相关数据, 这次则开始一点点构建咱们的量化交易系统了。 量化交易平台功能模块了解: 对于一个量化交易平台,它主要包含如下功能模块&#x…

使用Python获取股票实时数据和历史数据

决定新建一个专栏,专门研究股票数据的API接口。 由于不是混金融领域的人,百度调研了一会儿,没有找到合适的大公司维护的API接口。 yahoo-finance PyPI 这玩意架梯子都访问不到数据,不知道乍回事。许多大牛维护的pip包都是基于这…

Tushare免费获取股票数据:实时数据,历史数据,行情数据

一 操作手册 引导用户顺利开始使用Tushare Pro数据,以下步骤将带您开始Tushare数据之旅: 用户注册登录后可调用数据:https://tushare.pro/register?reg399205 二 如何获取TOKEN凭证 1、登录成功后,点击右上角->个人主页 2、…

如何用 Python 获取实时的股票数据?

这个我会!先上图 这篇回答中,我将向你展示两种不同的代码版本(加强版和一般版) 代码运行环境说明(非常重要) Python版本要求 Python 3 需要安装的库 efinance 库的安装方法是:打开 cmd&#x…

怎么用Python获取股票的实时数据?

学习目标: 应用industry实现行业股票列表的获取应用history_bars实现股票合约历史行情数据获取应用get_fundamentals实现股票基本面数据获取使用query的过滤条件完成股票数据的过滤应用scheduler定时器实现股票数据定期获取 1、 数据接口种类 获取指定行业、板块…

SAP UI5 Focus related

tap, keydown, keypresssap.ui.core.FocusHandlersap.ca.scfld.md.app.CommonHeaderFooterHelperevent new jQuery.Event(originalEvent);focusin, activate, blur, focusout, sapfocusleaveoElement._handleEvent(oEvent); 要获取更多Jerry的原创…

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI‘ in your configuration

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI’ in your configuration… 引导类加注解EnableFeignClients

Prime算法 C++实现

Prime算法 算法介绍: 课本实现方法: 先从最小堆说起(heap):任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶(即完全二叉树的根结点的位置)的结点的关键码是整个集合中最…

【数学】Prime-Factor Prime

Prime-Factor Prime 题目描述 A positive integer is called a "prime-factor prime" when the number of its prime factors is prime. For example, 12 is a prime-factor prime because the number of prime factors of 12223 is 3, which is prime. On the other…

Prime Factory (Training, Math)

Prime Factory (Training, Math) 题目描述 Your task is simple: Find the first two primes above 1 million, whose separate digit sums are also prime. As example take 23, which is a prime whose digit sum, 5, is also prime. The solution is the concatination of t…

Fiori Fundamentals和SAP UI5 Web Components

这周有位同事邀请我给团队讲一讲SAP技术的演进历史,所以我准备了下面几个主题来介绍。 其中SAP的技术回顾和演进,我的思路就是从前后台两方面分别介绍。 我画了一张非常简单的图: 去年5月我写过一篇文章:SAP UI和Salesforce UI开…