posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          用javascript編寫swing程序

          Posted on 2010-12-25 12:30 penngo 閱讀(4491) 評(píng)論(2)  編輯  收藏 所屬分類: Java
          在QT上可以使用QML語(yǔ)言來(lái)描述界面,而QML使用的腳本語(yǔ)言是javascript,不過(guò)咱們做java程序的也能使用javascript來(lái)開(kāi)發(fā)swing的界面。在jdk1.6中已經(jīng)帶有Mozilla Rhino 的 JavaScript 腳本引擎,下面用javascript編寫上一編基于郵件服務(wù)器的聊天測(cè)試http://www.aygfsteel.com/pengo/archive/2010/12/11/340303.html 界面。

          先在程序要指定要解析的腳本,Main.java
          import java.io.FileInputStream;
          import java.io.InputStreamReader;
          import javax.script.Invocable;
          import javax.script.ScriptEngine;
          import javax.script.ScriptEngineManager;
          import javax.swing.UIManager;

          public class Main {
              
          public static void main(String[] args) {
                  
          try {
                      UIManager
                              .setLookAndFeel(
          "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                      ScriptEngineManager factory 
          = new ScriptEngineManager();
                      
          // 指定腳本語(yǔ)言為javascript,engine支持很多種腳本語(yǔ)言
                      ScriptEngine engine = factory.getEngineByName("JavaScript");
                      
          // 告訴腳本引擎需要加載的腳本代碼
                      InputStreamReader in = new InputStreamReader(new FileInputStream(
                              
          "test.js"));
                      engine.eval(in);
                      Invocable inv 
          = (Invocable) engine;
                      inv.invokeFunction(
          "main");
                  } 
          catch (Exception e) {

                      e.printStackTrace();
                  }
              }
          }

          test.js腳本代碼
          importPackage(javax.swing);
          importPackage(javax.swing.border);
          importPackage(java.awt.event);
          importClass(java.lang.System);

          var contentPane;
          var messagePane;
          var sentPane;
          var button_1;

          function main(){
              var frame 
          = new JFrame();
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setBounds(
          100100542506);
              contentPane 
          = new JPanel();
              contentPane.setBorder(
          new EmptyBorder(5555));
              frame.setContentPane(contentPane);
              contentPane.setLayout(
          null);
              
              messagePane 
          = new JTextPane();
              messagePane.setContentType(
          "text/html");
              messagePane.setEditable(
          false);
              var scrollPane1 
          = new JScrollPane(messagePane);
              scrollPane1.setBounds(
          1010506290);
              contentPane.add(scrollPane1);
              
              sentPane 
          = new JEditorPane();
              var scrollPane 
          = new JScrollPane(sentPane);
              scrollPane.setBounds(
          10320506110);
              contentPane.add(scrollPane);
              var button 
          = new JButton("關(guān)閉");
              button.addActionListener(
                      
          new JavaAdapter(
                              ActionListener, {
                                  actionPerformed : function(event){
                                      System.exit(
          0);
                                  }
                              }
                      )
              );
              button.setBounds(
          3884355827);
              contentPane.add(button);
              
              button_1 
          = new JButton("發(fā)送");
              button_1.setEnabled(
          false);
              
              button_1.setBounds(
          4584355827);
              contentPane.add(button_1);
              
              var button_2 
          = new JButton("配置");
              button_2.setBounds(
          104315230);
              contentPane.add(button_2);
              
              var button_3 
          = new JButton("登錄");
              button_3.setBounds(
          694335230);
              contentPane.add(button_3);
              
              frame.setVisible(
          true);

          運(yùn)行效果:


          效果還是跟以前一樣帥,

          只要把規(guī)則定義好,java(swing/swt)程序也可以像QT一樣,定義一套類似QML的界面描述語(yǔ)言,方便開(kāi)發(fā)中的界面設(shè)計(jì)。

          附件:源碼

          評(píng)論

          # re: 用javascript編寫swing程序  回復(fù)  更多評(píng)論   

          2010-12-27 02:15 by Unmi
          很有新意,我也曾經(jīng)對(duì)比了各種腳本+界面的做法。

          # re: 用javascript編寫swing程序  回復(fù)  更多評(píng)論   

          2010-12-29 19:31 by thebye85
          用JS寫QT,有意思啊
          主站蜘蛛池模板: 南京市| 达尔| 类乌齐县| 屯昌县| 武宁县| 柳江县| 白河县| 沽源县| 和政县| 独山县| 萨嘎县| 佛坪县| 揭西县| 玉环县| 宣恩县| 霍城县| 湘乡市| 定南县| 五峰| 诸城市| 库车县| 青田县| 吴川市| 迭部县| 灌南县| 应城市| 澄江县| 蛟河市| 于都县| 光泽县| 衡山县| 金乡县| 宜宾市| 沭阳县| 长乐市| 临汾市| 灵寿县| 合作市| 高州市| 平山县| 遂宁市|