<o:p></o:p>
这是一个基于SWT的类似于千千静听播放器窗口那种展现方式的简单实现,即相关联的窗口中,辅窗口会随着主窗口的移动而移动。运行环境是JDK<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</st1:chsdate>+WinXP+SWT3.1.2。IDE使用的是Eclipse3.1.2。代码已测试成功。
下面的例子中我们会创建两个窗口类,MainGUI和AssistantGUI,他们分别代表主窗口和辅窗口。点击主窗口上的按钮会弹出辅窗口,当移动主窗口的时候,辅窗口会依附在主窗口上移动。辅窗口上单击可以将其关闭。
我们先来看看程序的代码:
主窗口类<o:p></o:p>
package testshell;<o:p></o:p>
<o:p> </o:p>
import org.eclipse.swt.SWT;<o:p></o:p>
import org.eclipse.swt.events.MouseAdapter;<o:p></o:p>
import org.eclipse.swt.events.MouseEvent;<o:p></o:p>
import org.eclipse.swt.events.SelectionAdapter;<o:p></o:p>
import org.eclipse.swt.events.SelectionEvent;<o:p></o:p>
import org.eclipse.swt.graphics.Rectangle;<o:p></o:p>
import org.eclipse.swt.widgets.Button;<o:p></o:p>
import org.eclipse.swt.widgets.Display;<o:p></o:p>
import org.eclipse.swt.widgets.Event;<o:p></o:p>
import org.eclipse.swt.widgets.Listener;<o:p></o:p>
import org.eclipse.swt.widgets.Shell;<o:p></o:p>
/**<o:p></o:p>
* @author lvpin<o:p></o:p>
* 2007-2-6 10:43:24<o:p></o:p>
*/<o:p></o:p>
public class MainGUI extends Shell {<o:p></o:p>
/**<o:p></o:p>
* Launch the application<o:p></o:p>
* @param args<o:p></o:p>
*/<o:p></o:p>
private static MainGUI mainGUI;<o:p></o:p>
private static Display display;<o:p></o:p>
static AssistantGUI assistantGUI;<o:p></o:p>
public static void main(String args[]) {<o:p></o:p>
try {<o:p></o:p>
display = Display.getDefault();<o:p></o:p>
mainGUI = new MainGUI(display, SWT.SHELL_TRIM);<o:p></o:p>
mainGUI.setBounds(300,300,500,375); <o:p></o:p>
mainGUI.addListener(SWT.Move,new Listener(){<o:p></o:p>
public void handleEvent(Event arg0) {<o:p></o:p>
Rectangle r=mainGUI.getBounds();<o:p></o:p>
if(assistantGUI!=null&&!assistantGUI.isDisposed()){<o:p></o:p>
assistantGUI.setBounds(r.x+r.width,r.y,200,200);<o:p></o:p>
}<o:p></o:p>
} <o:p></o:p>
});<o:p></o:p>
mainGUI.open();<o:p></o:p>
mainGUI.layout();<o:p></o:p>
while (!mainGUI.isDisposed()) {<o:p></o:p>
if (!display.readAndDispatch())<o:p></o:p>
display.sleep();<o:p></o:p>
}<o:p></o:p>
} catch (Exception e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* Create the shell<o:p></o:p>
* @param display<o:p></o:p>
* @param style<o:p></o:p>
*/<o:p></o:p>
public MainGUI(Display display, int style) {<o:p></o:p>
super(display, style);<o:p></o:p>
createContents();<o:p></o:p>
}<o:p></o:p>
/**<o:p></o:p>
* Create contents of the window<o:p></o:p>
*/<o:p></o:p>
protected void createContents() {<o:p></o:p>
setText("MainGUI");<o:p></o:p>
final Button button = new Button(this, SWT.NONE);<o:p></o:p>
button.addSelectionListener(new SelectionAdapter() {<o:p></o:p>
public void widgetSelected(final SelectionEvent e) {<o:p></o:p>
ininitAssistantGUI(); <o:p></o:p>
}<o:p></o:p>
});<o:p></o:p>
button.setText("assistant");<o:p></o:p>
button.setBounds(120, 220, 120, 30);<o:p></o:p>
}<o:p></o:p>
public static void ininitAssistantGUI(){<o:p></o:p>
if(assistantGUI==null||assistantGUI.isDisposed())<o:p></o:p>
assistantGUI=new AssistantGUI(display,SWT.SHELL_TRIM);<o:p></o:p>
assistantGUI.setBounds(mainGUI.getBounds().x+mainGUI.getBounds().width,<o:p></o:p>
mainGUI.getBounds().y,200,200);<o:p></o:p>
assistantGUI.addMouseListener(new MouseAdapter(){<o:p></o:p>
public void mouseDown(MouseEvent e){<o:p></o:p>
assistantGUI.stop();<o:p></o:p>
}<o:p></o:p>
});<o:p></o:p>
assistantGUI.open();<o:p></o:p>
assistantGUI.layout();<o:p></o:p>
}<o:p></o:p>
protected void checkSubclass() {<o:p></o:p>
// Disable the check that prevents subclassing of SWT components<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
辅窗口类<o:p></o:p>
package testshell;<o:p></o:p>
<o:p> </o:p>
import org.eclipse.swt.widgets.Display;<o:p></o:p>
import org.eclipse.swt.widgets.Shell;<o:p></o:p>
/**<o:p></o:p>
* @author lvpin<o:p></o:p>
* 2007-2-6 10:45:52<o:p></o:p>
*/<o:p></o:p>
public class AssistantGUI extends Shell {<o:p></o:p>
public AssistantGUI(Display display, int style) {<o:p></o:p>
super(display, style);<o:p></o:p>
createContents();<o:p></o:p>
}<o:p></o:p>
protected void createContents() {<o:p></o:p>
setText("AssistantGUI");<o:p></o:p>
}<o:p></o:p>
public void stop(){<o:p></o:p>
this.dispose();<o:p></o:p>
}<o:p></o:p>
protected void checkSubclass() {<o:p></o:p>
// Disable the check that prevents subclassing of SWT components<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
我们截取主要的几段分别来说:
(1)在主窗口上添加一个按钮,用来打开辅窗口。<o:p></o:p>
final Button button = new Button(this, SWT.NONE);<o:p></o:p>
button.addSelectionListener(new SelectionAdapter() {<o:p></o:p>
public void widgetSelected(final SelectionEvent e) {<o:p></o:p>
ininitAssistantGUI(); <o:p></o:p>
}<o:p></o:p>
});<o:p></o:p>
button.setText("button");<o:p></o:p>
button.setBounds(120, 220, 120, 30);<o:p></o:p>
在按钮上添加了一个SelectionListener,当点击按钮时会触发SelectionEvent事件,调用ininitAssistantGUI()方法来生成AssistantGUI的实例。
<o:p> </o:p>
(2)ininitAssistantGUI()方法。<o:p></o:p>
public static void ininitAssistantGUI(){<o:p></o:p>
if(assistantGUI==null||assistantGUI.isDisposed())<o:p></o:p>
assistantGUI=new AssistantGUI(display,SWT.SHELL_TRIM);<o:p></o:p>
assistantGUI.setBounds(mainGUI.getBounds().x+mainGUI.getBounds().width,<o:p></o:p>
mainGUI.getBounds().y,200,200);<o:p></o:p>
assistantGUI.addMouseListener(new MouseAdapter(){<o:p></o:p>
public void mouseDown(MouseEvent e){<o:p></o:p>
assistantGUI.stop();<o:p></o:p>
}<o:p></o:p>
});<o:p></o:p>
assistantGUI.open();<o:p></o:p>
assistantGUI.layout();<o:p></o:p>
}<o:p></o:p>
if(assistantGUI==null||assistantGUI.isDisposed())这句首先对assistantGUI进行判断,如果为空或者已经关闭则创建一个新的assistantGUI实例。然后对辅窗口的初始位置和大小进行设置,setBounds()方法有四个int型参数,分别代表窗口左上角的x,y值和窗口的宽(width)和高(height)。需要注意的是x,y值所对应的平面直角坐标系的原点在屏幕的左上角位置,向右x值为正且递增,向下y值为正且递增。由setBounds()的参数我们可以看出:
第一个参数:mainGUI.getBounds().x+mainGUI.getBounds().width<o:p></o:p>
说明辅窗口的x值为主窗口的x值加上主窗口的宽度,即辅窗口位于主窗口的右侧。
第二个参数:mainGUI.getBounds().y<o:p></o:p>
说明辅窗口的y值同主窗口的y值相同,与第一个参数共同定位的辅窗口位置很明显了,即辅窗口位于并列于主窗
口的右侧。
第三个参数:200 说明辅窗口的宽(width)为200。
第四个参数:200 说明辅窗口的高(height)为200。
<o:p> </o:p>
(3)移动主窗口时触发事件<o:p></o:p>
前面的2段代码实现了点击按钮实例化一个辅窗口,下面就来介绍一下移动主窗口时相应的使辅窗口跟随移动。实现的方法就是为主窗口添加一个“监听移动事件的内部匿名Listener”,当然你也可以用外部类实现,在此主要为了简化代码。
mainGUI.addListener(SWT.Move,new Listener(){<o:p></o:p>
public void handleEvent(Event arg0) {<o:p></o:p>
Rectangle r=mainGUI.getBounds();<o:p></o:p>
if(assistantGUI!=null&&!assistantGUI.isDisposed()){<o:p></o:p>
assistantGUI.setBounds(r.x+r.width,r.y,200,200);<o:p></o:p>
}<o:p></o:p>
} <o:p></o:p>
}); <o:p></o:p>
首先通过addListener()方法给主窗口添加一个通用监听器,该监听器对应窗口移动事件(SWT.Move)。Listener只有一个方法handleEvent,这个方法里你可以处理任何事件。需要注意的是,我们用的是一种untyped event机制,与untyped event相联系的两个类就是代码中的Listener和Event。在此称其为untyped event是因为其对应的不是一个特定的Listener(前面点击按钮代码中用的则是特定的Listener——SelectionListener,所它采用的是typed event机制)。
Rectangle是一个矩形类,在此它对应了主窗口的形状(如宽、高、起始位置等)。最后我们还是通过setBounds()方法来改变辅窗口的位置,使它跟随着主窗口移动。
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>
到此,一个基于SWT的窗口同步移动的程序就实现了,代码很简单,逻辑也不复杂。我认为它值得学习的地方主要是为窗口组件添加untyped event机制的事件监听,因为好多时候在使用SWT中我们想要完成的功能并没有对应特定的监听器,它给我们提供一个解决类似问题的途径。
我也是刚刚接触SWT不长时间,还处于不断地摸索学习中。上面的内容共享给同样处在SWT学习阶段的朋友,希望对您的学习和使用有所帮助。
<o:p> </o:p>
。<o:p></o:p>
相关推荐
在SWT(Standard Widget Toolkit)中,开发GUI应用程序时,我们可能会遇到需要让背景图片能够随着窗口拖动而移动的情况,但同时要确保图片不会超出窗口边界。标题"swt背景拖动不将图片拖出窗口"正是针对这一需求提出...
1. 事件监听:SWT中的事件包括按钮点击、键盘输入、鼠标移动等,通过实现相关监听器接口并添加到组件上,可以捕获并处理这些事件。 2. 信号和槽:SWT采用信号和槽的概念,信号表示某个事件的发生,槽是事件发生时...
SWT与Java的另一GUI库AWT和Swing不同,它不依赖于Java虚拟机的抽象窗口工具包,而是直接调用操作系统提供的API,因此可以实现更高效、更贴近系统风格的界面。 本案例的学习精华主要围绕以下几个关键知识点展开: 1...
SWT提供了多种布局管理器,如FillLayout、GridLayout、BoxLayout和FormLayout,帮助开发者有效地组织和排列窗口中的小部件。 4. **数据绑定**: SWT支持数据绑定,允许将控件的值直接绑定到模型对象的属性,简化...
这个示例项目是一个基于SWT实现的“收藏夹”功能,对于初学者来说,它是一个很好的起点,可以帮助理解如何使用SWT来创建功能性的GUI应用。 **收藏夹功能的实现** 在SWT中,我们可以利用Tree或List控件来实现收藏夹...
10. **Extension Points**:这是Eclipse插件系统的关键特性,允许开发者通过定义和实现扩展点来扩展Eclipse RCP应用程序的功能。 11. **Testing and Debugging**:Eclipse RCP提供了强大的测试和调试工具,如JUnit...
Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...
SWT是一种基于本地平台窗口系统的Java图形工具包,提供了跨平台的GUI支持,使得Java程序能够拥有接近原生的操作系统外观和感觉。 7. **GridBagLayout布局管理器**: GridBagLayout是一种非常灵活的布局管理器,它...
《Java游戏:爆笑三国斗地主》是一款基于Java编程语言开发的移动游戏,它将经典扑克游戏“斗地主”与三国历史元素相结合,为玩家带来独特且趣味十足的游戏体验。这款游戏的设计和实现涉及了Java语言的核心特性、图形...
1. **可视化设计**:通过直观的图形界面,开发者可以轻松地添加、移动和调整控件大小,构建复杂的用户界面。这种设计方式使得非专业程序员也能快速上手GUI开发。 2. **支持多种框架**:WindowBuilder支持包括Java ...
"沙箱矿车"是一个基于Java编程语言的项目,它可能是为了实现一个模拟或游戏环境,其中玩家可以操控矿车在虚拟的沙箱世界中移动。在这个项目中,"sandbox"通常指的是一个允许开发者自由实验、测试和创建新功能的环境...
在Java中,2D游戏开发通常涉及到Java AWT(抽象窗口工具包)或SWT(标准窗口工具包)库,但AbsCanvas可能使用了JavaFX或者自定义的渲染机制来提供更高效、更灵活的游戏开发环境。 **AbsCanvas核心概念** 1. **画布...
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6 本章小结.......
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6...
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6...