很多人以为swt与swing是同一种东西。其实不然。
AWT的优势在于,简单,稳定,兼容于任何一个java版本。也支持GUI组件的自动disposal。同时也是线程安全的。在AWT 中的图形用户界面是通过本地方法来实现的,每个AWT 方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT 所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。
而SWING,则是为了解决AWT的很多缺点。SWING 提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。 它们是JFC的一部分。 它们支持可更换的观感和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意观感。 轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
公司项目需要做一个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); } }); }
如果我们想要在它之前加入一个系统拖盘可以这么干:
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"); }
未完。待续。。。吃饭睡觉了。