Posted on 2010-12-25 12:30 
penngo 阅读(4525) 
评论(2)  编辑  收藏  所属分类: 
Java 
			 
			
		 
		在QT上可以使用QML语言来描述界面,而QML使用的脚本语言是javascript,不过咱们做java程序的也能使用javascript来开发swing的界面。在jdk1.6中已经带有Mozilla Rhino 的 JavaScript 脚本引擎,下面用javascript编写上一编
基于邮件服务器的聊天测试http://www.blogjava.net/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();
            // 指定脚本语言为javascript,engine支持很多种脚本语言
            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(100, 100, 542, 506);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    frame.setContentPane(contentPane);
    contentPane.setLayout(null);
    
    messagePane = new JTextPane();
    messagePane.setContentType("text/html");
    messagePane.setEditable(false);
    var scrollPane1 = new JScrollPane(messagePane);
    scrollPane1.setBounds(10, 10, 506, 290);
    contentPane.add(scrollPane1);
    
    sentPane = new JEditorPane();
    var scrollPane = new JScrollPane(sentPane);
    scrollPane.setBounds(10, 320, 506, 110);
    contentPane.add(scrollPane);
    var button = new JButton("关闭");
    button.addActionListener(
            new JavaAdapter(
                    ActionListener, {
                        actionPerformed : function(event){
                            System.exit(0);
                        }
                    }
            )
    );
    button.setBounds(388, 435, 58, 27);
    contentPane.add(button);
    
    button_1 = new JButton("发送");
    button_1.setEnabled(false);
    
    button_1.setBounds(458, 435, 58, 27);
    contentPane.add(button_1);
    
    var button_2 = new JButton("配置");
    button_2.setBounds(10, 431, 52, 30);
    contentPane.add(button_2);
    
    var button_3 = new JButton("登录");
    button_3.setBounds(69, 433, 52, 30);
    contentPane.add(button_3);
    
    frame.setVisible(true);
} 
运行效果:
 
效果还是跟以前一样帅,
只要把规则定义好,java(swing/swt)程序也可以像QT一样,定义一套类似QML的界面描述语言,方便开发中的界面设计。 
附件:
源码