`
leo
  • 浏览: 23555 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

SWT实践遇到的问题及解决

    博客分类:
  • JAVA
阅读更多
最近花了三天的时间写了我的第一个SWT的程序,由于是第一次,所有遇到了一些问题,总结在这里。
程序描述:程序运行后要在后台进行长时间的数据库操作,同时将一些状态信息及时显示在界面上。

开始的做法是直接写代码,界面代码和后台代码混杂在一起,后台边运行边更新界面信息,这样做的结果是,一旦程序运行了,界面就不能在有任何鼠标点击或者切换的操作系统的其它文件夹在回来,否则界面就死掉了。

其实,当SWT程序中有比较耗时的操作时,应该把耗时的操作抽取出来,启动一个线程去单独执行,再在这个线程中获取界面实例并修改其界面信息,在此,SWT提供了syncExec(Runnable)方法。

正确的做法用下面简单的代码事例表述:
用于控制界面部分的代码(ModelGenApp.java)
 
  1. startButton.addSelectionListener(new SelectionAdapter() {  
  2.             /* 
  3.              * 当按钮按下时,执行转换命令 
  4.              */  
  5.             public void widgetSelected(SelectionEvent e) {  
  6.                 setButtonState(false);  
  7.                 // 得到任务数,多线程使用变量要求为final类型  
  8.                 final int taskCount = mainTransformer.initTotalRowNum("T_S_SCENEINFO");  
  9.                 //设置进度条格数  
  10.                 progressBar.setMaximum(taskCount-1);  
  11.                 consoleText.append("["+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"]转换程序开始启动...\r\n");  
  12.                 //为后台任务新开一个线程  
  13.                 new Thread() {  
  14.                     public void run() {  
  15.                         mainTransformer.start(taskCount);  
  16.                     }  
  17.                 }.start();  
  18.                 consoleText.append("["+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"]转换程序启动结束\r\n");  
  19.             }  
  20.         }); 
注意:声明类变量private MainTransformer mainTransformer = new MainTransformer(this);//后台类的实例;
需要动态更新的组件要声明为类变量,并提供public的get方法;

后台程序代码(MainTransformer.java)
 
  1. /** 
  2.  * 开始执行 
  3.  */  
  4. public void start(int taskCount) {  
  5.   
  6.     ......//省去部分代码  
  7.   
  8.         for(int i=1;i<=this.totalRowNum;i++) {  
  9.             ......//一些操作  
  10.                 insertConsoleText("["+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"]====转换第"+i+"条数据完成====\r\n");  
  11.         }  
  12.                            ......//省去一些代码  
  13.   
  14. }  
后台类动态更新前台界面的代码代码
 
  1. /** 
  2.  * 插入文本 
  3.  * @param str 
  4.  */  
  5. private void insertConsoleText(final String str) {  
  6.     Display.getDefault().syncExec(new Runnable() {  
  7.         public void run() {  
  8.             genApp.getConsoleText().append(str);  
  9.         }  
  10.     });  
  11. }  
注意:后台程序需要声明前台界面的实例    private ModelGenApp genApp;
需要构造函数  
后台类的构造函数代码
 
  1. /** 
  2.      * 构造函数,取得前台界面对象 
  3.      * 
  4.      */  
  5.     public MainTransformer(ModelGenApp genApp) {  
  6.         this.genApp = genApp;  
  7.     } 

其它:
获取配置文件路径:File config = new File(new File("").getAbsoluteFile().getAbsolutePath()+"\\config\\jdbc.properties");
关闭窗口按钮的提示代码
 
  1. shell.addShellListener(new ShellAdapter(){  
  2.             //关闭窗口提示  
  3.             public void shellClosed(ShellEvent  e) {  
  4.             if(!MessageDialog.openConfirm(shell, "关闭""您真的要关闭窗口并退出程序吗?")) {  
  5.                 e.doit=false;//doit is a flag indicating whether the operation should be allowed  
  6.             }  
  7.             }  
  8.         });  

打包发布:
MANIFEST.MF写法:Main-Class大小写区分;其它不区分;每项之间需要一个空格分隔;Class-Path: ./lib/or....jar.(第三方jar包如果不和打包的程序在一个文件夹下,需要这种写法,且第三方jar包不能在程序jar包内部,否则程序找不到它们);
  • 描述: 程序打包后的文件夹结构
  • 大小: 7.7 KB
  • 描述: 程序运行中的抓图
  • 大小: 75.7 KB
分享到:
评论

相关推荐

    SWT内存泄露解决办法

    然而,SWT应用程序可能会遇到内存泄露问题,这会导致程序运行缓慢,甚至崩溃。本文将深入探讨SWT内存泄露的原因、如何检测以及解决方法。 内存泄露通常发生在程序不再需要对象时,但这些对象仍然保留在内存中,无法...

    swt2.rarswt2.rarswt2.rarswt2.rarswt2.rar

    10. 故障排查:可能包括常见问题和解决方案,帮助开发者解决在使用SWT过程中遇到的问题。 通过解压并合并这些PDF文件,可以获得完整的SWT学习资料,深入理解SWT的工作原理和实践应用。对于希望提升Java GUI编程能力...

    swt designer 激活程序

    解决这些问题需要对SWT和JFace有深入理解,并不断实践和调试。 总的来说,SWT Designer是一个强大的工具,可以帮助开发者更便捷地创建美观、功能丰富的Java GUI应用。然而,合法使用和尊重知识产权是每个开发者应有...

    SWT开发

    【描述】:虽然描述为空,但通过提供的博文链接——"https://samsongbest.iteye.com/blog/1298867",我们可以推测这篇文章可能分享了作者在使用SWT进行开发过程中的经验、技巧或遇到的问题以及解决方案。由于无法...

    swt 开发学习

    同时,社区论坛和Stack Overflow等平台上有大量的问答资源,可以帮助解决你在开发过程中遇到的问题。 总之,SWT是Java GUI开发中的一个重要选择,尤其适合那些需要高性能、低级系统访问的应用程序。通过扎实的学习...

    SWT调用OCX组件DEMO

    6. **调试与问题解决**:在实际开发过程中,可能会遇到权限问题、版本兼容性问题、控件操作异常等问题,需要对Java和Windows环境有深入理解,以便进行调试和优化。 通过这个DEMO,开发者可以学习到如何将Java的跨...

    使用Eclipse进行SWT编程

    然而,AWT面临一个关键问题,即“LCD”(Least Common Denominator,最低公因数)问题。这意味着AWT只能支持所有目标平台共有的功能,限制了其在特定平台上的表现力和功能范围。为了解决这一问题,Sun随后推出了...

    第一个java项目-图书管理系统(swt)

    如果在使用或学习过程中遇到问题,可以联系作者获取进一步的帮助和支持。 通过这个项目,你可以深入理解Java编程语言,了解如何使用SWT构建用户界面,以及如何与数据库进行交互。同时,它也是一个很好的实践机会,...

    SWT eclipse Jface API

    SWT (Standard Widget Toolkit)、Eclipse 和 JFace 是Java编程中用于开发...同时,利用丰富的社区资源和教程,可以快速上手并解决遇到的问题。记得定期查阅SWT和JFace的官方文档,以便获取最新的API信息和最佳实践。

    swt form

    通过查看和理解源代码,开发者可以更好地理解如何实现特定功能,或者如何解决在使用SWT Form时遇到的问题。 "工具"标签则暗示可能涉及到了使用某些工具或库辅助开发SWT Form,例如Eclipse IDE,它内置了SWT ...

    SWT.zip_IBM_it

    9. 故障排查和常见问题:列出开发者在使用SWT时可能会遇到的问题及其解决方案。 通过阅读并理解"SWT.pdf"的内容,开发者可以学习到如何利用IBM支持的SWT技术来提升其Java应用的用户界面体验,并实现高效、可靠的...

    SWT 视频教程 (flash版)

    SWT的出现解决了这些问题,它直接与操作系统的窗口系统交互,提供了更加原生的外观和感觉,同时在性能上也优于AWT和Swing。 SWT的核心概念包括控件(Widgets)、布局(Layouts)和事件(Events)。控件是构成用户...

    SWT + JFace 入门

    通过不断实践和查阅文档,这些问题都可以逐步解决。此外,加入开发者社区,参与讨论和提问,也是提高技能的有效途径。 总之,SWT + JFace为Java开发者提供了一个强大的工具集,用于创建高效且用户友好的桌面应用。...

    swt table 自己造个轮子

    - 链接指向的博客文章(https://chenyu-hz.iteye.com/blog/1842256)可能提供了详细的步骤、代码示例以及遇到的问题和解决方案。 - 通过阅读博客,可以深入了解作者如何构建自定义表格组件,以及可能遇到的挑战和...

    swt designer 7.6.0

    10. **社区支持**:作为成熟的开源项目,SWT Designer有一个活跃的社区,开发者可以通过论坛、邮件列表等途径获取帮助,分享经验,共同解决遇到的问题。 总之,SWT Designer 7.6.0是Eclipse IDE中的一个重要工具,...

    利用MyEclipse+SWT-Designer实现电子邮件客户端

    课程设计报告则可能详细记录了项目的开发过程、遇到的问题及解决方案,以及对系统功能和性能的评估。执行的Jar包是项目的最终产物,可以直接运行以体验完整的电子邮件客户端功能。 总之,这个项目不仅展示了...

    Java通过Ole调用Windows Media Player

    8. **异常处理**:由于涉及到与操作系统底层的交互,可能会遇到各种错误,如权限问题、找不到COM对象等,所以良好的异常处理机制是必不可少的。 通过以上步骤,你可以在Java程序中实现对Windows Media Player的控制...

Global site tag (gtag.js) - Google Analytics