Windows10にEclipseを入れてJavaアプレットを動かすまで

<!-- 図の形式 - 調整 - 修正 - 明るさ: -40% コントラスト: -40% -->

Windows10[^win10]（64ビット版）が入っているパソコンに日本語化されたEclipse[^eclipse]をインストールしてJavaアプレット[^applet]を動かします。

## 1. 要点

- Java開発キット（Java Development Kit；JDK）と日本語化された統合開発環境[Eclipse](https://www.eclipse.org/)（自動初期設定機能付き）を1つにまとめたものが「[Pleiades All in One Eclipse](https://mergedoc.osdn.jp/)」という名前で配布されています。

- Pleiades All in One Eclipseは圧縮ファイル（ZIP）で配布されていますが、Windows 10標準のファイル解凍機能は[長いパス名](https://docs.microsoft.com/ja-jp/windows/win32/fileio/maximum-file-path-limitation)を扱えない欠陥がありますので、正常に解凍できません。長いパス名に対応している[7-Zip](https://sevenzip.osdn.jp/)などの解凍ソフトが必要となります。

- 解凍したフォルダの`pleiades\eclipse\eclipse.exe`[^backspace]を実行すると、初めての場合は初期設定が自動で行われます。必要に応じてエディタの設定を行ったり、`eclipse.exe`へのショートカットを作成したりするとよいでしょう。

- Javaアプレットを使用するには、Java実行環境（Java Runtime Environment；JRE）のバージョンをJava1.8（Java 8と同義）に変更しておきます。


## 2. 7-Zipのインストール

7-Zipをインストールします[^unzip]。たとえば[窓の杜のここ](https://forest.watch.impress.co.jp/library/software/7zip/)からダウンロードすることができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/5e6d89b8-9346-6af1-41fa-916f220c7c06.png" width="500">

ダウンロードされたインストーラー（ここでは`7z1900-x64.exe`）を実行します[^download]。「Install」をクリックするとインストールされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/99767d93-aec0-9f9e-5e8a-457cb65fb632.png)

インストールに成功したら「Close」をクリックしてウィンドウを閉じましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/617a67aa-ec12-0352-84d1-7b271064522d.png)


### 7-Zipの日本語化

7-Zipをインストールするとエクスプローラーの右クリックメニューに「7-Zip」という項目が追加されますが、もしサブメニューの中身が日本語になっていなければ次の手順で日本語化できます。まず7-Zipをスタートメニューから起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/08a976af-2d6b-9710-1ecd-93279224c6d7.png)

7-Zipが起動したらメニューの「Tool」から「Options...」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/0eb1a6fd-44d5-40f7-671a-fbb8a7251c49.png)

「Language」タブで「Japanese (日本語)」を選び、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/9ba02c6a-f175-6e23-8215-db9a1b57d7e8.png)
いったんログオフして再度ログインすると[^restart]、エクスプローラーの右クリックメニューに設定が反映されているはずです。


## 3. Pleiades All in One Eclipseのインストール

[配布サイト](https://mergedoc.osdn.jp/)からPleiades All in One Eclipseをダウンロードします。2021年9月現在、「Eclipse 2021（最新版）」をクリックすると「リリース 2021-09」のページへとジャンプします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/921af941-f607-c5bd-2e3c-6699da88ec4a.png" width="600">

**Windows 64bit、Full Edition、Java**を選びます。「Download」をクリックすると、Zip形式の圧縮ファイルのダウンロードが始まります。ファイルサイズが約1.9GBと大きいので注意してください。時間があるときに気長にダウンロードしてみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/75e59919-9cb3-743d-88e0-c6a2f0f5ffd4.png" width="700">

自動的にダウンロードが始まらない場合は、自分でリンクをクリックしてダウンロードを開始してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/f08814fd-6ee7-172c-6f7b-47af1cffdcf6.png" width="600">

ファイルがダウンロードされたフォルダを開き[^open]、そのファイルを右クリックして「7-Zip」で展開します[^win11-7-zip]。ここでは「展開...」（日本語化してない場合は「Extract files...」）を選びます[^context-menu-ellipsis]。くれぐれも**Windows標準の解凍機能を使わない**ようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/49df5335-12fc-f4c0-f227-f6af8dd9a8ca.png)

続けて現れるダイアログボックスで、展開先を**Cドライブ直下（C:\）**とし[^backslash2] [^c-drive]、その下の**チェックを外し**ます。「OK」をクリックすると展開が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/b3e6819d-f632-2a4f-2bda-f9820cf86038.png)

展開が終わったら、`C:\pleiades\eclipse\eclipse.exe`を探します。これがEclipseの実行ファイルです。実行してみましょう。初回は自動的に初期設定が行われるので、起動に少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/129cd0b9-8fe0-ea66-843d-2d02783fb22a.png)

しばらくすると「ワークスペース[^workspace]」を選択するダイアログボックスが表示されます。まずはデフォルトのワークスペースを使うことにして「起動」してしまって構わないでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/b979a2e8-9e80-0906-8646-9ca45f017055.png)

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/6f9aaceb-ad13-cdf3-09c4-5174f210dae4.png)
-->

おめでとうございます。ひとまずEclipseが起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/590f407c-0b3c-ca64-d693-eaf938413fbb.png)


### Eclipseのショートカットを作る

毎回`eclipse.exe`を探して実行するのは面倒なので、デスクトップなどにショートカットを作っておくとよいでしょう。`eclipse.exe`を右クリックして「コピー」を選び、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/a134cc64-a565-2dff-1c70-6185a3a96ec7.png)


そのあと、デスクトップなどを右クリックして「ショートカットの貼り付け」を選ぶと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/19db198f-a2b0-8542-97d5-bd1fb9350dda.png)

できあがりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/fc0eaf3a-2c2e-cea3-7188-89ec8e43b0cd.png)

<!--
右ドラッグして「ショートカットをここに作成」を行います（コピーして「ショートカットの貼り付け」を使ってもよい）。
![make-shortcut.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/76b10541-7a3e-21d9-fbf4-e31386e2275b.gif)
-->


### Eclipseのショートカットにワークスペースを指定する

ショートカットのプロパティを編集することで、そのショートカットから起動したときに使用するワークスペースを指定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/c59dee14-0e66-0693-5e0a-520a91e01ead.png)

ショートカットのリンク先が`C:\pleiades\eclipse\eclipse.exe`になっていると思いますが、この後に半角スペースを入れ、続けて` -data "ワークスペースにしたいフォルダ名"`を追加します。たとえば、デスクトップの中の`私用`というフォルダの中に`work`というフォルダを作ってそれをワークスペースにするのであれば以下のように[^user-profile]リンク先を編集して「OK」をクリックします。

```:リンク先
C:\pleiades\eclipse\eclipse.exe -data "%USERPROFILE%\Desktop\私用\work"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/618f2ce0-298e-b699-b81f-22f4aa1e37e4.png)
次にこのショートカットを使ってEclipseを起動したときには、指定された通りのフォルダをワークスペースとして使用することになります[^does-not-exist]。

異なるワークスペースを指定した複数のショートカットを作っておいて、起動時にワークスペースを使い分けることも可能です。


### Eclipseの設定

Pleiades All in One Eclipseでは、かなり良い感じに初期設定をしてくれるのですが、追加で設定を行います。上部メニューから「ウィンドウ」-「設定」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/68845b90-e6ae-7564-1a70-1756e69af285.png)

設定ダイアログが開いたら「Java」-「エディター」-「保存アクション」と辿って「ソース・コードのフォーマット」と「追加アクション」にチェックをしておくと（通常は）幸せになれます[^formatter]。「適用して閉じる」をクリックしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/2ae94a15-4311-af62-f8a6-5e991d7c6f98.png)


## 4. Eclipseを使う


### アプリケーションを作る

初期状態では、画面左の「プロジェクト・エクスプローラー」に「ワークスペースにプロジェクト[^project]がありません」と表示されています。なので、ここではまず「Javaプロジェクト」を作成してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/b77beca3-ab4c-eaab-f3a6-65c1f269ad2b.png)
画面に見えている「Javaプロジェクトの作成」ボタンをクリックしても、上部メニューから「ファイル」-「新規」-「Javaプロジェクト」と辿っても構いません。

「新規Javaプロジェクト」ダイアログが表示されます。ここでは例としてプロジェクト名を`test`とします。また、使用するJREを**JavaSE-1.8に変更**します。あとで、このプロジェクト内でアプレットを使いたいからです。この**JREの選択を忘れるとアプレットが動きません**[^no-applet]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/e23b9749-7784-e833-c62e-289f16648f94.png)

Java言語でプログラムを構成する単位となるのはクラスというものです。1つのJavaプロジェクト内には、複数のクラスを作ることができます。`test`プロジェクト内に`Test1`というクラスを作ってみましょう。上部メニューから「ファイル」-「新規」-「クラス」と辿ります。プロジェクト・エクスプローラー内を右クリックして同様のメニューを使っても構いません。

「新規Javaクラス」ダイアログでクラスの名前を`Test1`にし、`public static void main(String[] args)`というメソッド・スタブにチェックを入れて[^main]、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/97a45535-8659-f140-22e9-1b36bc3b88e0.png)
パッケージ[^package]名として（プロジェクト名`test`から類推された）`test`がデフォルトで入力されていますが、あまり気にしなくてもよいです。

プロジェクト内に`Test1.java`というファイルが作成され、その内容が右側のエディターに表示されます。7行目に[Hello world](https://ja.wikipedia.org/wiki/Hello_world)と出力する命令を書いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/7fd8cc0a-19e1-11be-0673-a240ff104389.png)

```java:コピペ用&nbsp;Test1.java
package test;

public class Test1 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		System.out.println("Hello world");
	}

}
```

上部メニューから「実行」-「（4つ目の）実行」-「Javaアプリケーション」を選んで実行してみましょう（2回目からは「実行」-「（1番上の）実行」、あるいは`Ctrl+F11`を押してもよい）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/c43cbdb9-746d-6483-2a6c-62a2230d0eb1.png)

画面右下の「コンソール」に「Hello world」と出力されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/f50cc761-d247-14cc-8bce-54087e0eac16.png)


### アプレットを作る

今度は`test`プロジェクト内にアプレットを作ってみます。JREが**JavaSE-1.8に変更されていないと動きません**。次のように新規クラスを作ります。例として、クラス名は`TestApplet1`とします。スーパークラスに`java.applet.Applet`を指定します（**大文字と小文字の区別に注意**）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/2b7ef7a6-e3f9-cfd7-aec7-effbac121568.png)

プロジェクト内に`TestApplet1.java`というファイルが作成されます。これは（何もしない）立派なアプレットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/7b2dcf6a-732d-659c-775f-872f8716b896.png)

上部メニューより、Javaアプレットとして実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/c5ed5eda-1c91-f6fb-e741-d8b80cfdc203.png)

真っ白な（何もない）ウィンドウが表示されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/3dc9a0b3-8c59-a8a4-8c49-e4f6a4a55563.png)
気が済んだら「×」を押して閉じましょう。


### アプレットのデフォルトの幅と高さ

アプレット実行時のデフォルトのサイズを変えたいときは、「実行」-「実行構成...」のダイアログを開き、「パラメーター」のタブにある「幅」と「高さ」の値を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/1ed84624-e409-ebec-dbd8-80181827c629.png)


### アプレットの`getCodeBase()`と`getDocumentBase()`

アプレットのメソッドの`getCodeBase()`、`getDocumentBase()`で参照される場所は、「実行構成」の中の「引数」の「作業ディレクトリ」です。デフォルトはプロジェクトのフォルダーの中の`bin`フォルダーです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/5a3e7598-58c0-ac5b-6693-4fc99d5fd14d.png" width="600">

もし分かりにくければ、アプレット中で、実際にどこが参照されているかコンソールに書き出してみればよいでしょう。
<!-- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/09f2462e-006b-f5be-64a7-941995d81c14.png" width="400"> -->
```java:コピペ用&nbsp;ImageTest1.java
package test;

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

public class ImageTest1Applet extends Applet {
	Image img;

	@Override
	public void init() {
        // どこが参照されているか書き出す。
		System.out.println(getCodeBase());
		System.out.println(getDocumentBase());

		img = getImage(getDocumentBase(), "Sample.jpg");
	}

	@Override
	public void paint(Graphics g) {
		g.drawImage(img, 0, 0, this);
	}
}
```


### アプレットでアニメーションさせるとチラつく

とりあえず、次のように`update`メソッドをオーバーライドしておけば、（アニメーションでチラつくことは）なくなります[^flickering]。
```java
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
```
```java
	private Image offscreen = null;

	@Override
	public void update(Graphics g) {
		Dimension size = getSize();

		if (offscreen == null || offscreen.getWidth(this) != size.width || offscreen.getHeight(this) != size.height) {
			offscreen = createImage(size.width, size.height);
		}

		Graphics gg = offscreen.getGraphics();
		try {
			super.update(gg);
			g.drawImage(offscreen, 0, 0, this);
		} finally {
			gg.dispose();
		}
	}
```


## TODO (執筆するかも)
- ファイルのリダイレクト ⇒ 「実行」-「実行構成...」から「共通」の中の「標準入出力」で設定
- データファイルを置くフォルダ
- Java 1.8（pleiades\java\8\bin\javaw.exe）の高DPI設定
- macOS


[^win10]: Windows 10には「Home」と「Pro」がありますが、どちらでも構いません。Windows 11でも大丈夫そうです。

[^eclipse]: Eclipseはいわゆる[統合開発環境](https://ja.wikipedia.org/wiki/%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)というものの1つです。メモ帳とコマンドプロンプトとJDKさえあれば、それらを使ってJavaプログラムを作成・実行することは可能ですが、非常に面倒なので人は統合開発環境を使うのです。

[^applet]: [Javaアプレット](https://ja.wikipedia.org/wiki/Java%E3%82%A2%E3%83%97%E3%83%AC%E3%83%83%E3%83%88)とは、90年代後半に流行った、動的なWebコンテンツを作成する技術の1つです。[Flash](https://ja.wikipedia.org/wiki/Adobe_Flash)の台頭やその後の[Ajax](https://ja.wikipedia.org/wiki/Ajax)の隆盛とともに駆逐され、完全に[見捨てられてしまった](https://openjdk.java.net/jeps/289)技術ですが、教育用には細々と使われていたりします。（動作する最小の「おまじない」サイズも小さく（`java.applet.Applet`から継承したクラスを作るだけ）、初めての方に説明するときは、なんやかんやで便利です。もしアプレットの代わりにSwingを使うとしたら[これ](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/swing/package-summary.html)みたいな「おまじない」になるでしょうが、この意味となぜ必要かを理解するにはちょっと時間が掛かるかも。）

[^backspace]: 半角バックスラッシュ`\`は、日本語だと半角円記号`¥`みたいに表示されたりします。（ASCIIの範囲では）同じものです。日本語キーボードから入力するときはEnterキーの左上の「¥」キーを使ってください。Enterキーの左下の方にある「\」キーを使って入力してもよいですが、同じく半角円記号`¥`が表示されると思います。

[^unzip]: 長いパス名が扱えるのなら7-Zip以外のソフトを使って配布ファイルを解凍しても構わないのですが、この記事では7-Zipを使って解凍方法の説明をしています。

[^download]: ブラウザーから「開く」ことができない場合、インストーラーは（自分でダウンロードするフォルダを指定してなければ）おそらく「ダウンロード」というフォルダに保存されていますので、それを探して開きましょう。

[^restart]: 要はエクスプローラーを再起動する必要があります。タスクマネージャーから再起動するだけでもよいです。

[^open]: ブラウザーから「開く」を選んでしまうと、Windows標準の解凍機能を使ってしまって正常に解凍できないという現象が起こります。ダウンロードされたファイルはおそらく「ダウンロード」フォルダに保存されています。あせらず「ダウンロード」フォルダを開いて作業してください。

[^win11-7-zip]: Windows 11だと、デフォルトでは右クリックしても「7-Zip」うんぬんは見当たりませんが、「その他のオプションを表示」をクリックするとちゃんと出てきます。

[^context-menu-ellipsis]: メニューの最後に付いている「...」が大事です。ここをクリックしてもすぐに何か実行されるわけではなく、実行オプションを選ぶダイアログが表示されるという意味です（たぶん）。

[^backslash2]: もう一度書いておきますが、半角バックスラッシュ`\`は半角円記号`¥`の意味です。日本語キーボードであればEnterキーの左上の「¥」で入力してください。

[^c-drive]: 理由は2つ。1つは、長いパスに対応していないアプリケーションの誤動作をできる限り防ぐため。もう1つは、展開パスを統一しておいた方があとの説明が楽だからです。さまざまなEclipseのバージョンを同時に運用する可能性があるときは、`C:\pleiades\2021-09\eclipse\`のようなフォルダ構成で解凍してもよいかもしれません。

[^workspace]: ワークスペースとは、Eclipseの用語で、作ったプログラムやデータや様々な設定など、なんやかんやを保存しておく作業フォルダのことです。Eclipseを起動するときに1つ選ぶ必要があります。

[^user-profile]: `%USERPROFILE%`というのは、Windowsにおいてそれぞれのアカウントのユーザーフォルダになります。なので、`%USERPROFILE%\Desktop`はそのアカウントのデスクトップフォルダというわけです。

[^does-not-exist]: ワークスペースに指定したフォルダが存在しなければ、勝手に作成されます。

[^formatter]: 独自のコーディング規約に従っているプロジェクトのファイルを編集するときは、この設定をオフにしないと地獄を見ます。地獄への道はIDEの善意で実装されている。

[^project]: プロジェクトとは、Eclipseの用語で、プログラムやデータなどをひとまとめにして管理する単位となります。つまり普通の日本語の意味での「プロジェクト」と思ってよいでしょう。

[^no-applet]: アプレットを使わないプロジェクトであれば、そのまま最新のJREを使ってもらって構いません。

[^main]: チェックを入れておくと、ファイル生成時に`main`メソッドを付け足しておいてくれます。もちろん、あとで自分で書いても構いません。

[^package]: パッケージとは、Java言語の用語で、クラスが属する名前空間を提供するものです。平たく言うと、クラスの「苗字」みたいなものです。クラス名が同じでも、パッケージ名によって区別をつけることができます。

[^flickering]: リサイズはチラつきます。本当は`javax.swing.JComponent`での実装のように、[`update`は`paint`を呼ぶだけ](https://github.com/openjdk/jdk/blob/b6b0317f832985470ccf4bc1e2abf9015ce5bd54/src/java.desktop/share/classes/javax/swing/JComponent.java#L1036)にして、`paint`の中にダブルバッファリングのコードを書くべき。で、実際に描画するコードは`paintComponent`みたいな別の名前のメソッドに書いておいて、それを`paint`から呼んで、...ってもうそれ`javax.swing.JApplet`使えばよくない？