`
snippet
  • 浏览: 3014 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于SWT的窗口同步移动的实现

    博客分类:
  • SWT
阅读更多

<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.2IDE使用的是Eclipse3.1.2。代码已测试成功。

  下面的例子中我们会创建两个窗口类,MainGUIAssistantGUI,他们分别代表主窗口和辅窗口。点击主窗口上的按钮会弹出辅窗口,当移动主窗口的时候,辅窗口会依附在主窗口上移动。辅窗口上单击可以将其关闭。

我们先来看看程序的代码:

主窗口类<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>

2ininitAssistantGUI()方法。<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相联系的两个类就是代码中的ListenerEvent。在此称其为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背景拖动不将图片拖出窗口

    在SWT(Standard Widget Toolkit)中,开发GUI应用程序时,我们可能会遇到需要让背景图片能够随着窗口拖动而移动的情况,但同时要确保图片不会超出窗口边界。标题"swt背景拖动不将图片拖出窗口"正是针对这一需求提出...

    SWT综合教程及安装指导

    1. 事件监听:SWT中的事件包括按钮点击、键盘输入、鼠标移动等,通过实现相关监听器接口并添加到组件上,可以捕获并处理这些事件。 2. 信号和槽:SWT采用信号和槽的概念,信号表示某个事件的发生,槽是事件发生时...

    SWT 案例之学习精华

    SWT与Java的另一GUI库AWT和Swing不同,它不依赖于Java虚拟机的抽象窗口工具包,而是直接调用操作系统提供的API,因此可以实现更高效、更贴近系统风格的界面。 本案例的学习精华主要围绕以下几个关键知识点展开: 1...

    SWT的一些技术文章

    SWT提供了多种布局管理器,如FillLayout、GridLayout、BoxLayout和FormLayout,帮助开发者有效地组织和排列窗口中的小部件。 4. **数据绑定**: SWT支持数据绑定,允许将控件的值直接绑定到模型对象的属性,简化...

    SWT收藏夹示例源代码

    这个示例项目是一个基于SWT实现的“收藏夹”功能,对于初学者来说,它是一个很好的起点,可以帮助理解如何使用SWT来创建功能性的GUI应用。 **收藏夹功能的实现** 在SWT中,我们可以利用Tree或List控件来实现收藏夹...

    eclipse rcp 开发基础教程

    10. **Extension Points**:这是Eclipse插件系统的关键特性,允许开发者通过定义和实现扩展点来扩展Eclipse RCP应用程序的功能。 11. **Testing and Debugging**:Eclipse RCP提供了强大的测试和调试工具,如JUnit...

    JAVA上百实例源码以及开源项目源代码

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    Java开发工程师题库1.doc

    SWT是一种基于本地平台窗口系统的Java图形工具包,提供了跨平台的GUI支持,使得Java程序能够拥有接近原生的操作系统外观和感觉。 7. **GridBagLayout布局管理器**: GridBagLayout是一种非常灵活的布局管理器,它...

    Java游戏\爆笑三国斗地主.rar

    《Java游戏:爆笑三国斗地主》是一款基于Java编程语言开发的移动游戏,它将经典扑克游戏“斗地主”与三国历史元素相结合,为玩家带来独特且趣味十足的游戏体验。这款游戏的设计和实现涉及了Java语言的核心特性、图形...

    windowbuilder1.9.2

    1. **可视化设计**:通过直观的图形界面,开发者可以轻松地添加、移动和调整控件大小,构建复杂的用户界面。这种设计方式使得非专业程序员也能快速上手GUI开发。 2. **支持多种框架**:WindowBuilder支持包括Java ...

    sandbox-minecarts

    "沙箱矿车"是一个基于Java编程语言的项目,它可能是为了实现一个模拟或游戏环境,其中玩家可以操控矿车在虚拟的沙箱世界中移动。在这个项目中,"sandbox"通常指的是一个允许开发者自由实验、测试和创建新功能的环境...

    AbsCanvas:Java中的2D Tiled GameEngine(画布渲染)

    在Java中,2D游戏开发通常涉及到Java AWT(抽象窗口工具包)或SWT(标准窗口工具包)库,但AbsCanvas可能使用了JavaFX或者自定义的渲染机制来提供更高效、更灵活的游戏开发环境。 **AbsCanvas核心概念** 1. **画布...

    Eclipse权威开发指南2.pdf

    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 本章小结.......

    Eclipse权威开发指南3.pdf

    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...

    Eclipse权威开发指南1.pdf

    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...

Global site tag (gtag.js) - Google Analytics