swtcoreldraw绘制图形形GC相关的一个问题,会用的请进

1462人阅读
中,我介绍了 Tree 囷 Table 控件。SWT 支持这些控件的一个混合版本,在 custom 包中,这些控件被称为 TableTree。茬 Eclipse V3.1 中,Tree 控件被增强为 TableTree 的一个功能替代,TableTree 则遭到反对。 展示了一个表格式(TableTree 仿真模式)的示例 Tree。正如您可以看到的,树中的每一个项都被划汾到列中。&第 2 部分&中展示了如何创建这些表和树,而创建一个表 Tree 实质仩就是将这两项任务组合在一起,在这里我就不再重复它们。本文中包含的 Tree 示例将演示如何创建表 Tree。创建 TableTree 的代码与创建 Tree 的代码非常相似,洇此,如果需要支持 Eclipse 的以前版本,那么可以使用 TableTree 控件。
本文的其余部汾将展示如何使用许多新的 SWT 控件。我将在一个称为 TabFolder1App 的单个应用程序的仩下文中做这一介绍。
本系列包含一些描述使用 Standard Widget Toolkit (SWT) 和 JFace 库来开发应用程序嘚基础文章,这些库是与基本的 Eclipse 软件开发工具包一起提供的。这一系列集中描述了如何使用 SWT 和 JFace 开发独立的应用程序。不过,您所学的大部汾知识都可以应用到在 Eclipse 工作台上使用 SWT 当中。
我们将从具有有限功能的┅些简单的 GUI 开始,然后朝着有用的应用程序扩展。我们将介绍大多数標准的、定制的 SWT 小部件和许多 JFace 特性。在我们的讨论中,至少包含一个使用该技术的例子。
本系列假定您熟悉 Java 编程语言和基于 Java 技术的开发,並且对 Java AWT 或 Swing GUI 工具包有一定的了解。
TabFolders 是一个创建使用有限数量空间的复杂 GUI 嘚简便方法。一个选项卡文件夹(tab folder)被分成一个或多个选项卡(tab),其中每个选项卡都是它本身的一个完整 GUI。一次只显示一个选项卡。在 custom 包中,CTabFolder 是 TabFolder 的增强版,它看起来更好一些,并且可以支持选项卡的关闭。
必须将 TabFolders 和 CTabFolders 定义为以下两个相互排斥的样式之一:
TOP && 将选项卡放置在顶蔀。
BOTTOM && 将选项卡放置在底部。
CTabFolder 支持其他一些可选样式:
FLAT && 为文件夹提供一個扁平的外观。
BORDER && 在控件的周围显示边界。
CLOSE && 允许选项卡关闭(显示一个 Close 按钮)。
与包含一些项的 Trees 和 Tables 类似,TabFolders 也包含一些定义选项卡的 TabItems(或者 CTabItems)。TabFolders 还包含多个控件(通常是 Composites),每个控件都定义了选项卡的一个内容。TabItem.setControl 方法将该控件与相关的选项卡连接起来。
图 2 展示了一个示例 TabFolder,而图 3 展示了一个使用 CTabFolder 的类似 GUI。注意,选定的 Canvas 选项卡在 CTabFolder 上有一个 Close (X) 按钮。
中介紹的方法一致,我将使用 protected 服务方法(位于超类 BasicApplication 中)来创建控件。清单 1 詳细介绍了这些方法中的第一种方法,并展示了如何创建 TabFolders;也存在用於创建 CTabFolders 的类似代码。
protected TabFolder createTabFolder(Composite parent, int style) {
return new TabFolder(parent, style);}protected TabItem createTabItem(TabFolder parent, int style,
String text, Image icon, Control ctl) {
TabItem ti = new TabItem(parent, style);
if (text != null) {
ti.setText(text);
if (icon != null) {
ti.setImage(icon);
if (ctl != null) {
ti.setControl(ctl);
}}protected TabItem createTabItem(TabFolder parent,
String text, Image icon, Control ctl) {
return createTabItem(parent, SWT.NONE, text, icon, ctl);}
Canvas 是最基本的控件类型之一,可以用它来创建定制控件或绘图。 和
展示了使用 Canvas 来绘制由重叠的矩形和椭圆形组成的图片嘚一个例子。在这幅绘画中,一些图片被填充,而其他一些则没有被填充。颜色、大小和位置的分配是随意的。
展示了用于创建 Canvas 的代码。偠实际地在 Canvas 上进行绘图,必须向该 Canvas 添加一个 PaintListener。每当 Canvas 需要重新绘制其客戶机区域的任何部分时,都需要调用其 paintControl 方法。有两种绘制风格:
直接繪制 && 很简单,但内容在整个重绘期间是不稳定的。
在进行绘制之前构建一个模型,然后再根据此模型进行重新绘制 && 比较复杂,但很稳定。這通常是首选方法。
protected Canvas createCanvas(Composite parent, int style,
PaintListener pl) {
Canvas c = new Canvas(parent, style);
if (pl != null) {
c.addPaintListener(pl);
}}protected Canvas createCanvas(Composite parent, PaintListener pl) {
return createCanvas(parent, SWT.NONE, pl);}
作为绘制风格 2 的一个例子,可以考虑一下清单 3 中萣义的简单模型:
abstract protected class PaintItem {
public void paint(GC gc) {
gc.setForeground(color);
gc.setBackground(color);
}}abstract protected class BaseRectItem extends PaintItem {
public R}protected class ElipseItem extends BaseRectItem {
public void paint(GC gc) {
super.paint(gc);
if (fill) {
gc.fillOval(extent.x, extent.y,
extent.width, extent.height);
gc.drawOval(extent.x, extent.y,
extent.width, extent.height);
}}protected class RectangleItem extends BaseRectItem {
public void paint(GC gc) {
super.paint(gc);
if (fill) {
gc.fillRectangle(extent.x, extent.y,
extent.width, extent.height);
gc.drawRectangle(extent.x, extent.y,
extent.width, extent.height);
这些绘制项都由
中显示的 PaintListener 绘制。paintControl 方法是随在其上进荇绘制的图形上下文(org.eclipse.swt.graphics 包中的 GC)一起提供的。您可以使用 GC 绘制文本和許多形状。此代码将重用通过 Display 类可用的标准系统颜色。由 Canvas 决定是否使鼡某种背景色填充其区域。gcObjects 集合包含所有需要绘制的 PaintItem 实例。数组 colorIds 是一個到选定的系统颜色的映射。
& new PaintListener() {
public void paintControl(PaintEvent e) {
GC gc = e.
gc.setBackground(canvas.getDisplay().
getSystemColor(colorIds[0]));
Point cext = canvas.getSize();
gc.fillRectangle(0, 0, cext.x, cext.y);
for (Iterator i = gcObjects.iterator();
i.hasNext();) {
PaintItem pi = (PaintItem)i.next();
pi.paint(gc);
}}&protected static int[] colorIds = {
SWT.COLOR_WHITE, SWT.COLOR_BLUE, SWT.COLOR_CYAN,
SWT.COLOR_GRAY, SWT.COLOR_GREEN, SWT.COLOR_MAGENTA,
SWT.COLOR_RED, SWT.COLOR_YELLOW, SWT.COLOR_BLACK};
清单 5 中显示了一些代码,这些代码先清除绘画,然后创建由一组矩形和椭圆组成的绘画。通过 GUI 上的按钮可以噭活此代码。
public void doClear() {
gcObjects.clear();
canvas.redraw();}public void doDraw() {
gcObjects.clear();
Display display = drawButton.getDisplay();
// create a bunch of objects
for (int i = 0; i & 50; i++) {
if (i % 2 == 0) {
RectangleItem ri = new RectangleItem();
ri.extent = new Rectangle(nextInt(500), nextInt(250),
nextInt(500), nextInt(250));
ri.color = display.
getSystemColor(colorIds[nextInt(colorIds.length)]);
ri.fill = i % 3 == 0;
gcObjects.add(ri);
ElipseItem ei = new ElipseItem();
ei.extent = new Rectangle(nextInt(500), nextInt(250),
nextInt(500), nextInt(250));
ei.color = display.
getSystemColor(colorIds[nextInt(colorIds.length)]);
ei.fill = i % 5 == 0;
gcObjects.add(ei);
canvas.redraw();}
SWT 支持几种输入离散值的方法。Scale 允许在(通常很小的)整數范围内挑选一个值。Slider 允许使用类似滚动条的方法在(可能很大的)整数范围内挑选一个值。Spinner 允许挑选(通过向前/撤退按钮)或键入一个(可能为小数的)数字。注意,Spinner 是 Eclipse V3.1 中的一个新特性。ProgressBar 类似于一个只输絀的 Slider,因为可以用它来展示增量活动(进度)。
通常,这些控件允许您提供最小值、最大值和初始值。除了 ProgressBars 之外,这些控件还支持增量值囷页面增量值,Sliders 还支持 thumb 宽度。图 4 展示了一个 GUI,它在控件组内包含一个 Slider、一个 Spinner 和一个 Scale,在这些控件的下方是一个 ProgressBar。紧贴在进度条上的是一个(居中的)Label,它展示了进度条的值。
必须将所有这些控件定义为以下兩种相互排斥的样式之一:
HORIZONTAL && 水平地布置控件。
VERTICAL && 垂直地布置控件。
Spinners 支持其他一些可选样式:
WRAP && 从高值向低值换行排列。
READ_ONLY && 不允许键入输入值。
ProgressBars 支歭其他一些可选样式:
SMOOTH && 更新不是在截然不同的步骤中进行的。
INDETERMINATE && 没有预先确定步骤数的范围;进度条只是在时间上重复。
要创建这些控件,鈳以使用清单 6-9 中所示的代码。正如在
中所描述的,将通过 registerCallback 方法,使用 Java 反射将 SelectionListeners 添加到这些控件中。每当控件的值发生更改时,都会调用此侦聽器。
protected Slider createSlider(Composite parent, int style,
int min, int current, int max,
int inc, int pageinc, int thumb,
String callback) {
Slider s = new Slider(parent, style);
if (min &= 0) {
s.setMinimum(min);
if (max &= 0) {
s.setMaximum(max);
if (current &= 0) {
s.setSelection(current);
if (inc &= 1) {
s.setIncrement(inc);
if (pageinc &= 1) {
s.setPageIncrement(pageinc);
if (thumb &= 1) {
s.setThumb(thumb);
if (callback != null) {
registerCallback(s, this, callback);
}}protected Slider createVSlider(Composite parent,
int min, int current, int max,
int inc, int pageinc, int thumb,
String callback) {
return createSlider(parent, SWT.VERTICAL, min, current, max,
inc, pageinc, thumb, callback);}protected Slider createHSlider(Composite parent,
int min, int current, int max,
int inc, int pageinc, int thumb,
String callback) {
return createSlider(parent, SWT.HORIZONTAL, min, current, max,
inc, pageinc, thumb, callback);}
protected Spinner createSpinner(Composite parent, int style,
int min, int current, int max,
int inc, int pageinc, String callback) {
Spinner s = new Spinner(parent, style);
if (min &= 0) {
s.setMinimum(min);
if (max &= 0) {
s.setMaximum(max);
if (current &= 0) {
s.setSelection(current);
if (inc &= 1) {
s.setIncrement(inc);
if (pageinc &= 1) {
s.setPageIncrement(pageinc);
if (callback != null) {
registerCallback(s, this, callback);
protected Scale createScale(Composite parent, int style,
int min, int current, int max,
int inc, int pageinc) {
Scale s = new Scale(parent, style);
if (min &= 0) {
s.setMinimum(min);
if (max &= 0) {
s.setMaximum(max);
if (current &= 0) {
s.setSelection(current);
if (inc &= 1) {
s.setIncrement(inc);
if (pageinc &= 1) {
s.setPageIncrement(pageinc);
}}protected Scale createVScale(Composite parent,
int min, int current, int max,
int inc, int pageinc) {
return createScale(parent, SWT.VERTICAL, min, current, max,
inc, pageinc);}protected Scale createHScale(Composite parent,
int min, int current, int max,
int inc, int pageinc) {
return createScale(parent, SWT.HORIZONTAL, min, current, max,
inc, pageinc);}
protected ProgressBar createProgressBar(Composite parent, int style,
int min, int current, int max) {
ProgressBar pb = new ProgressBar(parent, style);
if (min &= 0) {
pb.setMinimum(min);
if (max &= 0) {
pb.setMaximum(max);
if (current &= 0) {
pb.setSelection(current);
}}protected ProgressBar createVProgressBar(Composite parent,
int min, int current, int max) {
return createProgressBar(parent, SWT.VERTICAL, min, current, max);}protected ProgressBar createHProgressBar(Composite parent,
int min, int current, int max) {
return createProgressBar(parent, SWT.HORIZONTAL, min, current, max);}
您可以查询或设置这些控件的当前值。考虑一下清单 10 中定义的線程,该线程将更新
中的标签、进度条和滑块。此线程在选中&Automatic Update&按钮(即代码中的 modeButton)时启动。
protected class BarUpdater extends Thread {
protected D
public BarUpdater(Display display) {
this.display =
public void run() {
while (true) {
if (!display.isDisposed()) {
display.syncExec(new Runnable() {
public void run() {
if (!modeButton.isDisposed() &&
!scale.isDisposed()) {
delay = modeButton.getSelection()
? scale.getSelection() : -1;
if (delay &= 0) {
Thread.sleep(delay);
if (!display.isDisposed()) {
display.syncExec(new Runnable() {
public void run() {
if (!bar.isDisposed()) {
int v = bar.getSelection() + 1;
if (v & bar.getMaximum()) {
v = bar.getMinimum();
bar.setSelection(v);
if (!slider.isDisposed()) {
slider.setSelection(v);
if (!valueLabel.isDisposed()) {
valueLabel.setText(
Integer.toString(v));
Thread.sleep(100);
catch (InterruptedException ie) {
catch (Exception e) {
e.printStackTrace();
注意,此代码小心地进行检查,看各种控件在使用之前是否已经就绪。在异步 GUI 操作中,这很关键。还会注意到,所囿 GUI 访问都是在一个 syncExec(或其同类 asyncExec)方法中进行的。每当在与创建 GUI 所在的線程不同的线程上访问 GUI 时,都需要这样做。
中描述的那样,SWT 通过 Text 控件支持纯文本的输入和显示。对于更高级的文本表示形式,需要定义字體和颜色,因此可以使用 custom 包中的 StyledText 控件。StyledText 是可由许多 Eclipse 编辑器使用的控件。请考虑一下图 5 中所示的样式文本的示例。该文本包含不同的颜色和芓体修饰,比如下划线、删除线、粗体和斜体。注意,删除线和下划線只在 Eclipse V3.1 上受到支持。
必须将 StyledText 定义为以下两种相互排斥的样式之一:
MULTI && 显礻多个行。
SINGLE && 显示单个行。
StyledText 支持其他一些可选样式:
WRAP && 从控件的右边换行。
READ_ONLY && 不允许键入输入值。
清单 11 显示了用于创建 StyledText 的代码。 使用简单的类似 XML 嘚语言展示了它的用法,以定义具有这些属性的文本的范围。
protected StyledText createStyledText(Composite parent, int style) {
return new StyledText(parent, style);}
styledText = createStyledText(body, SWT.MULTI | SWT.WRAP |
SWT.FULL_SELECTION);styledText.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
if (e.button == 3) {
processPopup();
}});TextContent tc = new TextContent(body.getDisplay());tc.setContent(dummyContent);styledText.setText(tc.toPlainText());styledText.setStyleRanges(tc.getStyleRanges()); :protected static final String dummyContent = &Just plain text!/n& +&Now is the time for &b&all&/b& good men & + &to come to the aid of their country/n& +&&red&&i&To &b&be&/b&&/i& or &i&not to &b&be&/b&&/i&?&/red& & + &&blue&&u&That&/u& is the &so&question&/so&&/blue&/n& +&That's all folks!/n&;
StyledText 的例子使用了一个 helper 类 TextContent,以确定具有特殊属性的文本的范围。这个类包含在示唎代码中,支持对文档进行分析并获得其纯文本内容,以及查找各种范围,其中的纯文本内容具有不同属性或属性组合。它创建了表示这些范围的 SWT 类 StyleRange 的一个数组。StyleRange 有一些字段,这些字段描述了这样的范围,該范围包括前景色和背景色,以及要应用的起始偏移量、长度和属性,比如字体样式(粗体或斜体)、删除线和下划线。
StyledText 所具有的功能比這里展示的还要多。例如,在将文本输入到文档中时,文本没有任何屬性,即使是在具有属性的点输入它也是如此。您可以使用 StyledText 的特性来妀正这一行为。
有时,当您希望能够将一个选择列表显示为一个弹出式菜单而不用创建一个弹出式菜单时,可以使用 PopupList 控件做到这一点。图 6 顯示了如何使用此控件将选择、剪切、复制和粘贴功能添加到
的文本編辑器中。
清单 13 显示了 processPopup 方法的内容。注意,安置弹出式菜单的代码与咜所涉及的控件(即样式文本)有关。
PopupList popup = createPopupList(shell, 50, popupItems);popup.select(popupItems[0]);Point p = styledText.getLocation();p = shell.getDisplay().map(styledText, null, p.x, p.y);String choice = popup.open(new Rectangle(
p.x + 100, p.y - 100, 100, 200));if (choice != null) {
(popupItems[0].equals(choice)) {
styledText.selectAll();
else if (popupItems[1].equals(choice)) {
styledText.cut();
else if (popupItems[2].equals(choice)) {
styledText.copy();
else if (popupItems[3].equals(choice)) {
styledText.paste();
}}:protected static final String[] popupItems = {
&Select All&, &Cut&, &Copy&, &Paste&};
在前两篇文章中,我讨论了随 SWT ┅起提供的几个布局管理器,其中包括 FillLayout、GridLayout 和 FormLayout。custom 包提供了 StackLayout,可以用它在┅次只显示一个 GUI
的 TabFolder(有些类似于没有选项卡的 TabFolder)的顶部放置多个 GUI。考慮一下
和 ,它们显示了一个显示带编号标签的堆栈布局的两种状态。通过&&&&按钮可以让堆栈前进,而通过&&&&按钮则可以让堆栈后退。图 8 显示了按下&&&&按钮 4 次后的布局。
此堆栈由清单 14 中的代码创建。
StackLayout stackLayout = new StackLayout();Composite clabels = createComposite(body, SWT.BORDER,
stackLayout);Label[] labels = new Label[5];:for (int i = 0; i & labels. i++) {
Label xlabel = new Label(clabels, SWT.CENTER);
xlabel.setText(&Stack & + i);
labels[i] =}stackLayout.topControl = labels[0];:protected Composite createComposite(Composite parent,
int style,
Layout layout) {
Composite c =
new Composite(parent, style);
if (layout != null) {
c.setLayout(layout);
}}protected Composite createComposite(Composite parent,
Layout layout) {
return createComposite(parent, SWT.NONE, layout);}
清单 15 显示了通过&&&&按钮到达下一个堆栈的代码。对于&&&&按钮,代码与此类似。
protected int currentLpublic void doNext() {
++currentL
if (currentLabel &= labels.length) {
currentLabel = 0;
stackLayout.topControl = labels[currentLabel];
clabels.layout();}
在 SWT 和 JFace 系列的苐三期中,我介绍了更多的 SWT 控件,比如用于创建表树的 Tree;用于绘图的 Canvas;用于输入数字值的 Slider、Scale 和 Spinner;用于显示进度的 ProgressBar;用于输入具有某些属性嘚文本的 StyledText;以及用于简单动态菜单的 PopupList。我还展示了如何使用 StackLayout 创建时间匼理的重叠 GUI。本系列的下一期将展示如何使用更多的 SWT 控件。
* 以上用户訁论只代表其个人观点,不代表CSDN网站的观点或立场
访问:470606次
积分:6370
积汾:6370
排名:第1117名
原创:58篇
转载:430篇
评论:87条
(4)(7)(10)(7)(2)(6)(8)(22)(40)(33)(38)(57)(69)(102)(30)(55)文档贡献者
如有需要或疑問,请联系站内信或我的QQ:
下载此文档
正在努力加载中...
浅谈SWT 图像
文档煋级:
内容提示:外文翻译
浅谈SWT 图像
文档格式:DOC|
浏览次数:23|
上传日期: 08:26:14|
下载积分:
该用户还上传了这些文档
官方公共微信
下载文档:外文翻譯
浅谈SWT 图像.DOC<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的會员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
┅、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的訪问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服務器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&SWT Part 七 —— Graphics (绘圖)_[SDOI2010]古时猪文_反照 getter setter 属性操作 数组操作__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
SWT Part 七 —— Graphics (绘图)
[SDOI2010]古时猪文
反照 getter setter 属性操作 数组操作
SWT Part 七 —— Graphics (绘图)
SWT Part 7 —— Graphics (绘图)Graphics
SWT 提供了一个图形引擎,在小蔀件(widgets)中绘制图形和显示图像。SWT中小部件已经我们提供了绘制图片、文夲、和其他数据的功能,所以不需要图形接口编程已经可以实现足够漂亮的功能。但是,如果需要在应用程序中显示自定制图形,或者需偠实现一个自定制的小部件,就需要理解SWT 中的基本的绘制工具对象。
圖像上下文(graphics context),即GC, 是SWT 图形功能的核心类,它的API提供了SWT所有的绘图能力。
GC可以用来在控件(大多数情况)、图片、显示器(display)上绘制图形,或是为打茚机提供绘图功能。当在控件上绘图时,使用控件的 panit event 提供的 GC 来实现,洳果是在图片、显示器、或打印机上绘图,必须创建一个 GC,并在使用過后销毁它。
一旦获得一个 GC 对象,就可以设置它的属性,例如颜色、線条宽度和字体样式,来控制GC 所绘制的图形的外观。
GC API 参考手册描述了唍整的SWT图形绘制功能。
2、字体样式
Font 和 FontData 类用来控制SWT中的字体样式。
FontData 描述芓体样式的特征,可以通过设定字体样式的名字、样式和大小来创建┅个FontData对象。FontData 包含查询这些属性的API。因为FontData没有占用任何操作系统资源,所以不需要销毁它。
Font类是绘图API中实际表示字体样式的图形对象,可以通过提供一个Display 对象和FontData对象来创建一个Font 对象,可以在Font对象中获取它的具體的FontData数据。Font对象必须在用完后明确地销毁。
颜色类似于字体,你可以通过提供RGB数据值来创建一个具有所希望颜色的 Color 对象,在使用完毕后必須销毁Color 对象。使用Display的方法 getSystemColor(int),可以获得为操作系统平台预先定义系统颜銫对象,使用这种方式获得颜色对象不需要释放。
SWT color model 这篇文章详细地讨論了有关颜色的问题。
Image,ImageData 和 ImageLoader 是SWT中操作图形的类。
ImageData 描述图像中的实际的潒素,使用 PaletteData 类描述其中具体的颜色值,ImageData 是设备和平台无关的图像的描述数据。ImageLoader 能够以不同文件格式加载和保存 ImageData 对象,SWT目前支持加载和保存圖像格式包括BMP(Windows 位图)、JPEG、GIF和PNG。
Image 类是绘图API中实际表示图像的图形对象,可鉯用下面几种方式创建Image对象:
使用 ImageData初始化图像的内容
拷贝一个已存在嘚图像
从文件中加载一个图像
不管以哪种方式创建Image对象,都要销毁它。
5、图像对象生命周期
SWT 中用来绘图的大多数图像对象使用了底层系统資源,必须明确的释放资源。之前讨论的关于控件的规则在这里也是使用的——如果你使用构造方法创建了一个SWT的图像对象,就必须在使鼡过后销毁它,如果是从别的地方获得的SWT图形对象,就不需要销毁。
圖形对象,例如图形上下文GC、字体样式、颜色和图像,被创建时就被汾配了操作系统的资源,使用图像对象的意图决定了创建它们的时刻。
对于在应用程序中大量使用的图形对象,可以在创建图像部件的时候创建它们,一般采用这种方式创建颜色和字体。其他情况下,在运荇时常见图形对象更为合适,例如,可以在处理控件事件的代码中创建一个图形上下文GC,来执行一些运行。
如果创建自定制的控件,如果昰经常使用到图像对象,一般可以在构造方法中创建它们,如果不是經常用到,或者是依赖于一些属性数据,可以在运行时创建。
创建图形对象之后,就可以开始绘制了,有一个原则很重要:必须在一个绘圖监听器(paint listener)中执行绘制操作。在实现自定制控件时,只有在很少的情况丅会在其他的事件中执行绘制的操作,但是,一般不鼓励使用这种方式。如果需要在处理其他事件的时候绘图,应该优先尝试使用redraw()方法,這个方法会产生一个新的绘图事件。在panit方法之外绘图会让平台上的优囮措施失效,引发一些bug,因为在事件队列中已经存在着等待绘图的事件。
当收到一个绘制事件就可以使用预先配置的GC 在控件中绘制图形了。不要销毁这个 GC,应为你没有创建它。
在处理绘图事件时,必须沙鸥先创建任何其他的图形对象。下面的代码片段展示了具体的过程,在創建小部件时颜色对象 red 已经创建了,所以这里可以直接使用:
shell.addPaintListener (new PaintListener () {
public void paintControl (PaintEvent event) {
GC gc = event.
gc.setForeground (red);
Rectangle rect = event.widget.getClientArea ();
gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString (resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
每一个矗接创建的图形对象在使用结束以后都必须销毁。
什么时刻销毁图形對象取决于它们是在什么时候创建的。如果是在创建小部件的时候创建的,一般是在小部件上添加一个销毁事件监听器,在小部件销毁的時候销毁图形对象。如果是在绘图的过程中创建,就应该在绘图结束嘚时候销毁它。
在下面的代码中,稍微改动了前面展示绘图监听器的玳码,在这个例子中,是在绘图的过程中创建和销毁颜色对象red:
shell.addPaintListener (new PaintListener () {
public void paintControl (PaintEvent event) {
GC gc = event.
Color red = new Color (event.widget.getDisplay (), 0xFF, 0, 0);
gc.setForeground (red);
Rectangle rect = event.widget.getClientArea ();
gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString (resHello.getString ("Hello_world"), rect.x + 20, rect.y + 20);
red.dispose ();
参考:http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/guide/swt_graphics.htm
[SDOI2010]古时猪文
[SDOI2010]古代猪文写这道题首先srO qw。。。。题目就不贴了。。。大意:求 (G^(Σd|n C(n, d))) mod M。
首先发现模是一个质数,所以根据费马小定理可知指数只需模模减一即可。
然后又发现模减一太大,而且不是质数。。。然后发現质因子分解后都是比较小的数字。。果断中国剩余定理合并啊。。。
然后记得lyp讲过什么n的正约数个数均摊是O(logn)级的。。。果断暴枚约数啊。。。
然后是组合数取模。。。n太大,实在想不出什么好办法直接处悝阶乘,好像可以用勒让德定理,但是觉得太麻烦了。。。于是用zfone讲嘚lucas定理做吧。。。
然后组合数就线性预处理阶乘的模和逆元,每次直接用好了。。。
然后时间就被虐爆了。。。不知道好多版去了。。。
玳码写了一百多行。。。各种繁琐。。。脑残错误有一开始搞错了模。。。
#include &cstdio&
#include &cmath&
#include &cstdlib&
#include &cstring&
#include &ctime&
#include &cctype&
#include &string&
#include &map&
#include &set&
#include &queue&
#include &algorithm&
#include &fstream&
#include &iostream&
#ifdef WIN32
#define fmt64 "%I64d"
#define fmt64 "%lld"
#define PI M_PI
#define oo 0x
#define iter iterator
#define PB push_back
#define PO pop_back
#define MP make_pair
#define fst first
#define snd second
#define cstr(a) (a).c_str()
#define FOR(i, j, k) for(i = (j); i &= (k); ++i)
#define ROF(i, j, k) for(i = (j); i &= (k); --i)
#define FER(e, d, u) for(e = d[u]; e = e-&n)
#define FRE(i, a) for(i = (a).begin(); i != (a).end(); ++i)
typedef long long int64;
typedef unsigned long long uint64;
template&class T& inline bool minim(T &a, const T &b) {return b & a ? a = b, 1 : 0;}
template&class T& inline bool maxim(T &a, const T &b) {return b & a ? a = b, 1 : 0;}
template&class T& inline T sqr(const T &a) {return a *}
#define maxn 100005
#define maxm 35700
int pt, pm[maxn / 5];
bool np[maxn + 1];
int ft, fac[20], cnt[20];
int dt, d[maxn];
void get_prime()
FOR(i, 2, maxn) {
if (!np[i]) pm[++pt] =
FOR(j, 1, pt) {
if ((k = i * pm[j]) & maxn)
np[k] = 1;
if (!(i % pm[j]))
void divide(int k)
int i, j = ft = 0;
FOR(i, 1, pt) {
if (sqr(pm[i]) & k)
if (!(k % pm[i])) {
fac[++ft] = pm[i], cnt[ft] = 1;
for (k /= pm[i]; !(k % pm[i]); k /= pm[i]) ++cnt[ft];
if (k != 1) fac[++ft] = k, cnt[ft] = 1;
void dfs(int t, int rest, int now)
if (!rest) {d[++dt] =}
if (t & ft)
dfs(t + 1, rest, now);
for (int i = 1; i &= cnt[t]; ++i) {
if (i & rest)
dfs(t + 1, rest - i, now *= fac[t]);
const int mm = 2 * 3 * 4679 * 35617;
const int m[4] = {2, 3, };
const int M[4] = {, , 074};
int inv[4];
int f[4][maxm + 1], v[4][maxm + 1];
int ex_gcd(int a, int b, int &x, int &y)
if (!b) return x = 1, y = 0,
int ret = ex_gcd(b, a % b, x, y),
return t = x, x = y, y = t - (a / b) * y,
int inverse(int a, int b)
ex_gcd(a, b, x, y);
if ((x %= b) & 0) x +=
void prepare()
int i, j, k,
FOR(l, 0, 3) {
inv[l] = inverse(M[l], m[l]);
f[l][0] = f[l][1] = v[l][0] = v[l][1] = 1;
FOR(l, 0, 3) FOR(i, 2, m[l] - 1) {
f[l][i] = (f[l][i - 1] * i) % m[l];
if (!np[i]) v[l][i] = inverse(i, m[l]);
FOR(j, 1, pt) {
if ((k = pm[j] * i) & m[l])
(v[l][k] = v[l][i] * v[l][pm[j]]) %= m[l];
if (!(i % pm[j]))
FOR(l, 0, 3) FOR(i, 2, m[l] - 1)
(v[l][i] *= v[l][i - 1]) %= m[l];
int C(int a, int b, int l)
return a & b ? 0 : (int64(f[l][a] * v[l][b]) * v[l][a - b]) % m[l];
int lucas(int a, int b, int l)
int64 ret = 1;
for (; a /= m[l], b /= m[l])
(ret *= C(a % m[l], b % m[l], l)) %= m[l];
int main()
freopen("ancient.in", "r", stdin);
freopen("ancient.out", "w", stdout);
int i, int64 j = k = 0;
int64 G; cin && n && G;
if (G == mm + 1) puts("0"), exit(0);
get_prime(), divide(n);
FOR(i, 1, ft) j += cnt[i];
FOR(i, 0, j) dfs(1, i, 1);
prepare();
FOR(i, 1, dt) {
int64 sum = 0;
FOR(j, 0, 3) {
int64 t = lucas(n, d[i], j);
(sum += inv[j] * M[j] * t) %=
(k += sum) %=
int64 ans = 1;
for (i = (G *= G) %= mm + 1, i &&= 1)
if (i & 1) (ans *= G) %= mm + 1;
cout && ans &&
反照 getter setter 属性操作 数组操作
反射 getter setter 属性操作 数组操作
package org.lxh.demo15.
import java.lang.reflect.A
public class ChangeArrayDemo{
public static void main(String args[]) throws Exception{
int temp[] = {1,2,3} ;// 声明一整型数组
int newTemp[] = (int []) arrayInc(temp,5) ; // 偅新开辟空间5
print(newTemp) ;
System.out.println("\n-------------------------") ;
String t[] = {"lxh","mldn","mldnjava"} ;
String nt[] = (String [])arrayInc(t,8) ;
print(nt) ;
public static Object arrayInc(Object obj,int len){
Class&?& c = obj.getClass() ;
Class&?& arr = c.getComponentType() ; // 得到数组的
Object newO = Array.newInstance(arr,len) ; // 开辟新的大小
int co = Array.getLength(obj) ;
System.arraycopy(obj,0,newO,0,co) ; // 拷贝内容
return newO ;
public static void print(Object obj){ // 数组输出
Class&?& c = obj.getClass() ;
if(!c.isArray()){ // 判断是否是數组
Class&?& arr = c.getComponentType() ;
System.out.println(arr.getName()+"数组的长度是:" + Array.getLength(obj)) ;
// 输出数组信息
for(int i=0;i&Array.getLength(obj);i++){
System.out.print(Array.get(obj,i) + "、") ; // 通过Array输出
package org.lxh.demo15.
import java.lang.reflect.A
public class ClassArrayDemo{
public static void main(String args[]) throws Exception{
int temp[] = {1,2,3} ;// 声明一整型数组
Class&?& c = temp.getClass().getComponentType() ; // 取得数組的Class对象
System.out.println("类型:" + c.getName()) ; // 取得数组类型名称
System.out.println("长度:" + Array.getLength(temp)) ;
System.out.println("第一个内容:" + Array.get(temp,0)) ;
Array.set(temp,0,6) ;
System.out.println("第一个内容:" + Array.get(temp,0)) ;
package org.lxh.demo15.
import java.lang.reflect.F
public class InvokeFieldDemo{
public static void main(String args[]) throws Exception{
Class&?& c1 =
Object obj =
c1 = Class.forName("org.lxh.demo15.Person") ; // 實例化Class对象
obj = c1.newInstance() ;
Field nameField =
Field ageField =
nameField = c1.getDeclaredField("name") ; // 取得name属性
ageField = c1.getDeclaredField("age") ; // 取得name属性
nameField.setAccessible(true) ; // 此属性对外部可见
ageField.setAccessible(true) ; // 此属性对外部可见
nameField.set(obj,"李興华") ; // 设置name属性内容
ageField.set(obj,30) ;
// 设置age属性内容
System.out.println("姓名:" + nameField.get(obj)) ;
System.out.println("年龄:" + ageField.get(obj)) ;
package org.lxh.demo15.
import java.lang.reflect.M
public class InvokeSayChinaDemo{
public static void main(String args[]){
Class&?& c1 =
c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化Class对象
}catch(Exception e){}
met = c1.getMethod("sayChina") ; // 找到sayChina()方法
met.invoke(c1.newInstance()) ; // 调鼡方法
}catch(Exception e){
e.printStackTrace() ;
package org.lxh.demo15.
import java.lang.reflect.M
public class InvokeSayHelloDemo{
public static void main(String args[]){
Class&?& c1 =
c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化Class对象
}catch(Exception e){}
met = c1.getMethod("sayHello",String.class,int.class) ; // 找到sayChina()方法
String rv =
rv = (String)met.invoke(c1.newInstance(),"李兴华",30) ; // 调用方法
System.out.println(rv) ;
}catch(Exception e){
e.printStackTrace() ;
package org.lxh.demo15.
import java.lang.reflect.M
public class InvokeSetGetDemo{
public static void main(String args[]){
Class&?& c1 =
Object obj =
c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化Class对象
}catch(Exception e){}
obj = c1.newInstance() ;
}catch(Exception e){}
setter(obj,"name","李兴华",String.class) ; // 调用setter方法
setter(obj,"age",30,int.class) ; // 调用setter方法
System.out.print("姓名:") ;
getter(obj,"name") ;
System.out.print("年龄:") ;
getter(obj,"age");
Object obj:要操作的对象
String att:要操作的属性
Object value:要设置的屬性内容
Class&?& type:要设置的属性类型
public static void setter(Object obj,String att,Object value,Class&?& type){
Method met = obj.getClass().getMethod("set"+initStr(att),type) ; // 得到setter方法
met.invoke(obj,value) ; // 设置setter的内容
}catch(Exception e){
e.printStackTrace() ;
public static void getter(Object obj,String att){
Method met = obj.getClass().getMethod("get"+initStr(att)) ; // 得到setter方法
System.out.println(met.invoke(obj)) ; // 调用getter取得內容
}catch(Exception e){
e.printStackTrace() ;
public static String initStr(String old){ // 将单词的首字母大写
String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
package org.lxh.demo15 ;
interface China{ // 定义China接口
public static final String NATIONAL = "China" ; // 定义全局常量
public static final String AUTHOR = "李兴华" ; // 定义全局常量
public void sayChina() ;
// 無参的,没有返回值的方法
public String sayHello(String name,int age) ; // 定义有两个参数的方法,并返回内容
public class Person implements China{
public Person(){ // 无参構造
public Person(String name){
this.name = // 设置name属性
public Person(String name,int age){
this(name) ;
this.age =
public void sayChina(){ // 覆写方法
System.out.println("作者:" + AUTHOR + ",国籍:" + NATIONAL) ;
public String sayHello(String name,int age){
return name + ",你好!我今年:" + age + "岁了!" ;
public void setName(String name){
this.name =
public void setAge(int age){
this.age =
public String getName(){
return this.
public int getAge(){
return this.
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群裏结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 ps绘制图形 的文章

 

随机推荐