[Java][JavaScript] notepad-js-swing
maven-rhino-compiler-plugin なんてものを作ったのでサンプルアプリケーションとしてメモ帳を作ってみました.
JavaScript のソースコードは続きに.
Java よりは writability が上がるけどクラス名やメソッド名は Java のままなので IDE のサポートなしに書くのは結構大変な気がする.
importPackage(Packages.java.lang) importPackage(Packages.java.util) importPackage(Packages.java.text) importPackage(Packages.java.io) importPackage(Packages.java.awt) importPackage(Packages.java.awt.event) importPackage(Packages.javax.swing) // message catalog var messageBundle try { messageBundle = ResourceBundle.getBundle("say.hello.js.notepad.Messages") } catch (e) { } function _(key) { var value = key try { value = messageBundle.getString(key) } catch (e) { } return value; } // application var app = { _frame : null, _menuBar : null, _textArea : null, _fileChooser : null, _filePath : null, get filePath() { return this._filePath; }, set filePath(newFilePath) { this._filePath = newFilePath; this.frame.setTitle(this._filePath + " - " + _("application.title")); }, get fileChooser() { if (this._fileChooser == null) { this._fileChooser = new JFileChooser(); } return this._fileChooser; }, get textArea() { if (this._textArea == null) { this._textArea = new JTextArea(); } return this._textArea; }, get frame() { if (this._frame == null) { this._frame = new JFrame(); this._frame.title = _("application.title") this._frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE // MenuBar this._frame.setJMenuBar(this.menuBar) // TextArea var scrollPane = new JScrollPane(this.textArea) scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) scrollPane.setPreferredSize(new Dimension(500, 400)) this._frame.add(scrollPane, BorderLayout.CENTER); // etc this._frame.locationByPlatform = true this._frame.pack() } return this._frame; }, get menuBar() { var self = this; if (this._menuBar == null) { this._menuBar = new JMenuBar(); var menuShortcutKeyMask = Toolkit.defaultToolkit.menuShortcutKeyMask // File var fileMenu = new JMenu(_("File")); fileMenu.setMnemonic(KeyEvent.VK_F) this._menuBar.add(fileMenu) var openMenuItem = new JMenuItem(_("Open"), KeyEvent.VK_O) openMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_O, menuShortcutKeyMask) openMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.open(); } }); fileMenu.add(openMenuItem); var saveMenuItem = new JMenuItem(_("Save"), KeyEvent.VK_S) saveMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutKeyMask) saveMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.save(); } }); fileMenu.add(saveMenuItem); var saveAsMenuItem = new JMenuItem(_("SaveAs"), KeyEvent.VK_A) saveAsMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.saveAs(); } }); fileMenu.add(saveAsMenuItem); fileMenu.addSeparator() var exitMenuItem = new JMenuItem(_("Exit"), KeyEvent.VK_X) exitMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { System.exit(0); } }); fileMenu.add(exitMenuItem); // Edit var editMenu = new JMenu(_("Edit")); editMenu.setMnemonic(KeyEvent.VK_E) this._menuBar.add(editMenu) var cutMenuItem = new JMenuItem(_("Cut"), KeyEvent.VK_T) cutMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_X, menuShortcutKeyMask) cutMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.textArea.cut(); } }); editMenu.add(cutMenuItem); var copyMenuItem = new JMenuItem(_("Copy"), KeyEvent.VK_C) copyMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_C, menuShortcutKeyMask) copyMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.textArea.copy(); } }); editMenu.add(copyMenuItem); var pasteMenuItem = new JMenuItem(_("Paste"), KeyEvent.VK_P) pasteMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_P, menuShortcutKeyMask) pasteMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.textArea.paste(); } }); editMenu.add(pasteMenuItem); var deleteMenuItem = new JMenuItem(_("Delete"), KeyEvent.VK_L) deleteMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0) deleteMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.textArea.replaceSelection(""); } }); editMenu.add(deleteMenuItem); editMenu.addSeparator() var selectAllMenuItem = new JMenuItem(_("SelectAll"), KeyEvent.VK_A) selectAllMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_A, menuShortcutKeyMask) selectAllMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.textArea.selectAll(); } }); editMenu.add(selectAllMenuItem); var dateTimeMenuItem = new JMenuItem(_("DateAndTime"), KeyEvent.VK_D) dateTimeMenuItem.accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0) dateTimeMenuItem.addActionListener(new ActionListener(){ actionPerformed : function(e) { self.insertDateAndTime(); } }); editMenu.add(dateTimeMenuItem); // Format var formatMenu = new JMenu(_("Format")); formatMenu.mnemonic = KeyEvent.VK_O this._menuBar.add(formatMenu) var wrapMenuItem = new JCheckBoxMenuItem(_("LineWrap")) wrapMenuItem.setMnemonic(KeyEvent.VK_W) wrapMenuItem.addItemListener(new ItemListener(){ itemStateChanged : function(e) { self.textArea.lineWrap = (e.getStateChange() == ItemEvent.SELECTED) } }); formatMenu.add(wrapMenuItem); } return this._menuBar; }, open : function() { var result = this.fileChooser.showOpenDialog(this.frame) if (result == JFileChooser.APPROVE_OPTION) { this.filePath = this.fileChooser.selectedFile this.readText(); } }, readText : function() { try { var is = new FileInputStream(this.filePath); var reader = new InputStreamReader(is, "UTF-8"); var br = new BufferedReader(reader); var lines = new Array() var line; while ((line = br.readLine()) != null) { lines.push(line) } br.close(); this.textArea.setText(lines.join("\n")); } catch (e) { print(e); } }, save : function() { if (this.filePath == null) this.saveAs(); else this.writeText(); }, saveAs : function() { if (this.filePath != null) { this.fileChooser.setSelectedFile(this.filePath.getAbsoluteFile()); } var rc = this.fileChooser.showSaveDialog(this.frame) if (rc == JFileChooser.APPROVE_OPTION) { this.filePath = this.fileChooser.selectedFile this.writeText(); } }, writeText : function() { try { var os = new FileOutputStream(this.filePath); var writer = new OutputStreamWriter(os, "UTF-8"); var bw = new BufferedWriter(writer); bw.write(this.textArea.text); bw.close(); } catch (e) { print(e) } }, insertDateAndTime : function() { var format = new SimpleDateFormat("HH:mm yyyy/MM/dd") var dateAndTime = format.format(new Date()); this.textArea.replaceSelection(dateAndTime) }, } // startup routine SwingUtilities.invokeLater(new Runnable({ run : function(){ //UIManager.lookAndFeel = UIManager.crossPlatformLookAndFeelClassName UIManager.lookAndFeel = UIManager.systemLookAndFeelClassName app.frame.visible = true } }))