2021/01/22
雑感オブSwing

2017年と2018年にgitのGUIクライアントを作ろうと思ってSwingで書いてたんだけど、さっき何にも覚えてなかったからプロジェクト開いて、ついでにbitbucketからGitHubにもってきてpublicにしてきた。思い出してきたことを並べてみる。

  • 罫線
  • フォーカス
  • Object
  • メインスレッド

罫線が一級市民という感じに便利ですごい、というのがGUIフレームワークとしてのSwingの特徴なんじゃないか、とほとんど真面目に思ってる。ちなみに、javax.swing.borderというパッケージと、javax.swing.BorderFactoryというクラスがあります。iOSだとUIKitではなくその下のCore Animationに罫線のAPIがあって、Androidはざっくり言うと背景として図を描けてそこに罫線が登場する。モバイルアプリのGUIフレームワークの選択がどういうことなのかは分からないけど、単純に違ってるだけで楽しくなってくる。罫線の存在感があるのは例えばエクセルだけど、GUIというよりは書類の世界が透けて見える。線を引くのは人間で、世界はあんまり縁どられていない。でも、人間は線を引きたい。そして、モバイルでもWebでも2次元のUIを扱っているせいか、「我々は矩形から逃れられないんじゃないか」みたいな気持ちが自分にはずっとある。それならばいっそのこと罫線に屈してしまうのもアリなのかもしれない、とSwingを書きながら考えていた。3Dってなんか怖いよね。つまり現世は怖い。

フォーカスのことをどうして俺たちは忘れてしまえるんだろう。テキスト入力エリアへのフォーカスというのはモバイルでもWebでも意識するのだけど、それ以外では忘れていたかのように、Swingを書いてるとフォーカスのことを「思い出す」という体験が何度かあった。正確に何を思い出していたのかは思い出せない。それが何であれ忘れてしまえるのは、パソコンでもだいたいのアプリケーション全画面で使ってるからでしょ、というのはありそう。Swingというよりデスクトップアプリの話だね。Swingを採用する前はElectronを検討していたんだけど、あれは複数Windowあるのかな?

Objectがインターフェイスに頻出するのは、Swingがジェネリクス以前から存在するからで、歴史を感じて楽しいよ、という話。現実的に困ることは無かったような。これ以外にも同様のレガシーがあったかも。レガシーといえば、JetBrains以外ほとんど誰もSwingを書いていないせいで、いんたーねっとにある皆様の記事が古く、とはいえSwingは変わってないから役に立たないわけじゃないんだけど、サンプルコードのJavaが古くて、そういうところでも歴史探訪で面白かった。さらに、当時の自分はJava7のシンタックスが一部ぎりぎり使えるAndroidの世界から来ていて、最新のJava8で書ける喜びがあり、Swingはもはや人類の歴史の教科書だったと言っても過言ではない。

メインスレッドがUIスレッドじゃないというのが、なんか面白かった。特に、SwingのUIスレッドで動かすRx用のSchedulerを作るためにRxAndroidのコードを参考にしていたときに、違いについて考えてたら楽しくなった。Androidはエントリーポイントがアプリケーション側には現れないけど、メインスレッドがUIスレッドになっている。SwingはUIスレッドはメインスレッドとは別だから自分でmainとかで

SwingUtilities.invokeLater(() -> new Application(Preference.shared()).start());

みたいに呼び出さなきゃいけないし、逆に言うと、CLIプログラムから任意のタイミングでGUIを呼び出せる。はず。Swingの代表的アプリケーションであるIntelliJは、この特性によって何かメリットかデメリットを享受してたりしたら興奮するんだけど、これはJetBrainsに入るしかないか……。

日付
タイトル