package bs.util.tool.commongui.plugins; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import bs.util.tool.commongui.GuiJPanel; import bs.util.tool.commongui.GuiUtils; /** * 执行Script脚本. */ public class RunScript extends GuiJPanel { private static final long serialVersionUID = 1L; /** * 脚本文本域. */ private JTextArea scriptTextArea = createJTextArea(GuiUtils.font14_un); /** * 结果文本域. */ private JTextArea resultTextArea = createJTextArea(GuiUtils.font14_un); /** * 脚本类型. */ private String[] scriptTypes = getScriptTypes(); /** * 当前脚本类型. */ private String curScriptType = scriptTypes[0]; public RunScript() { // 边界布局 setLayout(new BorderLayout()); // Center,脚本及结果输入输出域,使用2行1列的Grid布局,使其平均显示 JPanel textAreaPanel = new JPanel(new GridLayout(2, 1)); add(textAreaPanel, BorderLayout.CENTER); JPanel scriptPanel = new JPanel(new BorderLayout()); addJLabel(scriptPanel, " 执行脚本: ", GuiUtils.font14b_cn, BorderLayout.WEST); scriptPanel.add(new JScrollPane(scriptTextArea), BorderLayout.CENTER); textAreaPanel.add(scriptPanel); JPanel resultPanel = new JPanel(new BorderLayout()); addJLabel(resultPanel, " 执行结果: ", GuiUtils.font14b_cn, BorderLayout.WEST); resultPanel.add(new JScrollPane(resultTextArea), BorderLayout.CENTER); textAreaPanel.add(resultPanel); // East,操作区域,使用BorderLayout布局 JPanel actionPanel = new JPanel(new BorderLayout()); add(actionPanel, BorderLayout.EAST); // 放置下拉框等 JPanel actionGridPanel = new JPanel(new GridLayout(5, 1)); actionPanel.add(actionGridPanel, BorderLayout.NORTH); // 脚本类型下拉框 JPanel scriptTypesPanel = new JPanel(new FlowLayout()); addJLabel(scriptTypesPanel, "脚本类型:", GuiUtils.font14b_cn); addJComboBox(scriptTypesPanel, scriptTypes, GuiUtils.font13, new ActionListener() { public void actionPerformed(ActionEvent event) { curScriptType = ((JComboBox) event.getSource()).getSelectedItem().toString(); } }); actionGridPanel.add(scriptTypesPanel); // 放置执行按钮 JPanel buttonPanel = new JPanel(new GridLayout(2, 1)); actionPanel.add(buttonPanel, BorderLayout.SOUTH); // 执行按钮 addJButton(buttonPanel, "执行", "", GuiUtils.font14b_cn, new MouseListener() { public void mouseReleased(MouseEvent event) { String input = scriptTextArea.getText(); ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName(curScriptType); try { resultTextArea.setText(String.valueOf(se.eval(input))); } catch (ScriptException e) { showExceptionMessage(e); } } public void mousePressed(MouseEvent e) { resultTextArea.setText(""); } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }); } /** * 支持的脚本类型. */ private String[] getScriptTypes() { ScriptEngineManager sem = new ScriptEngineManager(); List<ScriptEngineFactory> factorys = sem.getEngineFactories(); Set<String> languages = new LinkedHashSet<String>(); for (ScriptEngineFactory factory : factorys) { languages.add(factory.getLanguageName()); } String[] types = new String[languages.size()]; int i = 0; for (String name : languages) { types[i] = name; i++; } return types; } }