JAVA Swt初识

来源:互联网 发布:医学数据挖掘 编辑:程序博客网 时间:2024/06/08 09:42

JAVA Swt
进入java C/S世界

很多人以为swt与swing是同一种东西。其实不然。

awt/swing是sun公司发布的jdk里的,拥有较强的跨平台性。swt/jface是开发eclipse用的一系列框架,后来单独分离出来。跨平台性相对差,这里只是说相对于linux/unix而言。因为它一定程序上利用了windows。它是IBM在AWT和Swing上经过优化开发出的新的GUI。也许你很难想像用SWT开发出eclipse,然后又在eclipse上开发Swt应用吧。


AWT的优势在于,简单,稳定,兼容于任何一个java版本。也支持GUI组件的自动disposal。同时也是线程安全的。在AWT 中的图形用户界面是通过本地方法来实现的,每个AWT 方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT 所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。


而SWING,则是为了解决AWT的很多缺点。SWING 提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。 它们是JFC的一部分。 它们支持可更换的观感和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意观感。 轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。


Eclipse项目用称为SWT的的图形库和工具包取代了Java标准中的AWT和Swing。SWT直接调用了操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。SWT 的缺点主要在于两点:(1) 不是Java语言标准;和(2) 支持的平台太少。

公司项目需要做一个java swt程序监控服务器硬件,网络等各方面状态。用sigar实现的。目前已经差不多了。然后还需要做一个客户端程序安装在运维程序的电脑上,一旦服务器状态出现异常,可以及时处理。没办法。只好用java再做一个swt程序来实现。其实我觉得用c#实现可能更容易。呵呵。不过公司要求的是用java,就来初识java swt吧。至于为何选用swt原因很简单,它提供了很多的图形化界面。目前好像ORACLE的netBeans也有这种功能了。

开发SWT需要安装Matisse这个插件,网上找了好久才找到。新版的myeclipse是集成了的。不过我的是myeclipse6.5。

Matisse4 for myeclipse下载地址:

matisse4 for myeclipse

安装后可以看到new时多了一个选项。选择一个Application或者Jframe都可以。点击finish完成。

如果点击finish完成后没有生成相应的.form和.java文件。很可能是没有导入相关的2个jar包。swing-layout.jar和absoluteLayout.jar。导入即可。

我们可以右侧导航图看到相应的GUI。

如图:

熟悉C#的朋友,发现他还真像C#!。呵呵。至少我这种走过来的人这么认为。。。有图形控件可以拖动,属性,事件等。

点击source可以查看源码。发现入口函数就是一个main方法。运行发现窗体并不是居中的。我们让他居中需要修改入口函数如下:

public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() {public void run() {Main main = new Main();main.setVisible(true);main.setLocationRelativeTo(null);//null,则此窗口将置于屏幕的中央main.jButton1ActionPerformed(null);}});}

我们可以发现还有另外一个main方法,他是初始化组件的。包括初始化前,正在初始化和初始化后,默认只有initCompent()初始化组件。

如果我们想要在它之前加入一个系统拖盘可以这么干:

TrayIcon icon;public static boolean flag = true;private void init() {String root = System.getProperty("user.dir");System.out.println(root);icon = new TrayIcon(Toolkit.getDefaultToolkit().createImage(root + "/resource/img/1.jpg"));if (SystemTray.isSupported()) {// 判断系统是否托盘// 创建一个托盘图标对象// 创建弹出菜单PopupMenu menu = new PopupMenu();// 添加一个用于退出的按钮MenuItem item = new MenuItem("EXIT");MenuItem item2 = new MenuItem("STOP");item.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {System.exit(0);} catch (Exception ex) {System.exit(0);}}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {flag = false;jButton1.setEnabled(true);jButton2.setEnabled(false);setInfo("\n程序已经正常停止");} catch (Exception ex) {System.exit(0);}}});menu.add(item);menu.add(item2);// 添加弹出菜单到托盘图标icon.setPopupMenu(menu);icon.setToolTip("信息收集器正在运行中......");// --托盘单事件 icon.addMouseListener(new MouseAdapter() {public void mouseClicked(final MouseEvent e) {if (e.getButton() == MouseEvent.BUTTON1) {setVisible(true);setState(Frame.NORMAL);}}});SystemTray tray = SystemTray.getSystemTray();// 获取系统托盘try {tray.add(icon);} catch (AWTException e1) {e1.printStackTrace();}// 将托盘图表添加到系统托盘}}

/** Creates new form Main */public Main() {init();initComponents();initOther();}private void initOther() {String root = System.getProperty("user.dir");System.out.println(root);Toolkit tk = Toolkit.getDefaultToolkit();this.setIconImage(tk.createImage(root + "/resource/img/1.jpg"));}


如何判断你是单击?中击?右击?

private void button1MouseClicked(java.awt.event.MouseEvent evt) {int s=evt.getButton();JOptionPane.showMessageDialog(null, s);}
evt.getButton()=1返回表示鼠标左键单击,2表示中击 3表示右键单击

choice中加入下拉选项,及判断选择:

private void choice1ItemStateChanged(java.awt.event.ItemEvent evt) {String str=choice1.getSelectedItem();JOptionPane.showMessageDialog(null, str);}private void initData() {choice1.add("1");choice1.add("2");choice1.add("3");choice1.add("4");}


未完。待续。。。吃饭睡觉了。