[JavaScript] 03 ElectronによるGUIアプリ作成 その1

ElectronによるGUIアプリ作成に取り掛かりましたが、やはりJavaFXで要素を自在にドラッグする快適さが忘れられず、とりあえず下記コードまでにしてJRuby+JavaFXでの開発環境構築に移行します。

style.cssファイルにてグリッド設定を書いていて、あまりの面倒さに頭が拒否反応を示しました。paddingを書く気力が早々になくなりました。おそらくHTMLやCSSの文法が私には合わないのでしょう。Sassのようにfor文を使えたらまだいいんですが。

これなら多少不満があってもPythonのtkinterで書きます。せっかくJavaScriptとお近づきになれたのに残念です。

どうやら日々のプログラミング生活でロジカル思考が染み付いてしまい、ルールに縛られた上での思考が苦手になっているのでしょう。なので異なるプログラミング言語間の行き来は比較的容易でも、論理よりもルールが優先のスタイルシート言語等ではストレスが溜まるようです。

次にJavaScriptのコードを書くのはいつになることでしょう。

const {app, BrowserWindow} = require('electron');

// メインウィンドウ
let mainWindow;

function createWindow() {
  // メインウィンドウ作成
  mainWindow = new BrowserWindow({
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: false
    },
    width: 300, height: 150,
  });

  // メインウィンドウに表示するhtmlファイル指定
  mainWindow.loadFile('index.html');

  // メインウィンドウが閉じられたときの処理
  mainWindow.on('closed', () => {
    mainWindow = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
    app.quit();
});

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});
<html>
<head>
 <meta charset="UTF-8">
 <title>CHARACTER CODE CONVERTOR</title>
 <link rel="stylesheet" href="style.css">
</head>

<body>
    <div id="container">

    <text id="lbl1">Path</text>
    <input id="txt1" type="TEXT"></input>
    <button id="btn1" >判定</button>

    <text id="lbl2">コード</text>
    <input id="txt2" type="TEXT"></input>
    <button id="btn2" >変換</button>

    </div>
</body>
</html>
body {
    background-color: #91d8e8;
}
#container {
    display: grid;
    grid-template-rows: 50px 50px;
    grid-template-columns: 50px 50px 50px 50px;
    position:relative;
    top: 10px;
}
#lbl1 {
    grid-row:1;
    grid-column:1;
}
#txt1 {
    grid-row:1;
    grid-column: 2 / 4;
}
#btn1 {
    grid-row:1;
    grid-column:4;
}

#lbl2 {
    grid-row:2;
    grid-column:1;
}

#txt2 {
    grid-row:2;
    grid-column:2;
}

#btn2 {
    grid-row:2;
    grid-column:4;
}

[JavaScript] 02 JavaFX イベントハンドラの作成

FXMLファイルにおいて、イベントハンドラによるボタン押下時の動作内容等の設定はJavaScriptやJythonなどJSR 223にあるスクリプト言語でできるようです。

とりあえずJavaScriptで簡単なイベントを書いてみました。さてJythonの場合はどうすればいいのでしょう。

<?xml version="1.0" encoding="UTF-8"?>

<?language javascript?>
<?import javafx.scene.effect.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="125.0" prefWidth="300.0" style="-fx-background-color: khaki;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
	<fx:script>
		function onButton1Action(){
			text1.setText("JavaScriptテスト");
		}
	</fx:script>
	<children>
     	<Label layoutX="14.0" layoutY="15.0" prefHeight="44.0" prefWidth="69.0" text="Path" />
     	<Label layoutX="14.0" layoutY="64.0" prefHeight="44.0" prefWidth="69.0" text="文字コード" />

     	<TextField fx:id="text1" layoutX="49.0" layoutY="24.0" prefHeight="27.0" prefWidth="175.0" />
     	<TextField fx:id="text2" layoutX="90.0" layoutY="73.0" prefHeight="27.0" prefWidth="135.0" />

		<Button fx:id="button1" layoutX="240.0" layoutY="24.0" mnemonicParsing="false" onAction="onButton1Action(event);" text="判定" />
     	<Button fx:id="button2" layoutX="237.0" layoutY="69.0" mnemonicParsing="false" prefHeight="35.0" prefWidth="51.0" text="変換" />
	</children>
</AnchorPane>

[JavaScript] 01 標準入力取得

Javaを本格的に学び始めて3週間が経過し、初級者なりのコードが書けるようになりました。

次はこれまで無意識に遠ざけていたJavaScriptの学習に着手します。Python、Javaに次ぐ私の第3言語にしたいと考えています。WordPressやMySQLの管理で役に立ちそうなPHPまであわよくば手を伸ばして4言語を駆使するようになるのが当面の目標です。

学習内容はJavaと同じく競馬DBを使った検索アプリの作成です。

まずは標準入力の取得です。

PythonやJavaと比較しながらマイペースで進めていきます。

console.log("競走馬名を入力してください");

var input = require("fs").readFileSync("/dev/stdin", "utf8");
console.log(input)