Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

Processingで手動でウィンドウサイズを変更する

こんばんは、かささぎです。エイプリルフールですが真面目に書いていきます。


今回は久しぶりにProcessingについて書きます。題材は描画ウインドウのサイズを手動で変更する処理についてです。

ブラウザやエクスプローラーなどで立ち上がる画面の端にマウスカーソルを合わせると矢印のマークに変わり、そのままドラッグするとウインドウサイズが変わります。

この機能はProcesingで立ち上がる画面ではデフォルトではできません。有効化する方法は簡単なのですが、今回はその機能について詳しく掘り下げていきます。

実装方法

この一文を加えるだけでできます。

surface.setResizable( true );

引数は変更できるかどうかを表しているので、trueにすることでできるようになります。falseにすると変更不可能になります。デフォルトはfalseです。

詳細の解説

surfaceというのはPSurfaceクラスのインスタンスです。
PsurfaceクラスはProcessing3で実装され、主にウインドウに関する処理をすることができます。

surfaceはProcessing側で用意されていますが、別途インスタンスを取得することもできます。
このように記述します。

PSurface psf = getSurface();
psf.setResizable( true );

変更前の状態を保持したい際などに利用します。

サンプルプログラム

今回は少し長いので、Gistにして貼ります。

gista2b2e67445f802386a4dc0d1357d7363

<実行結果>
f:id:yh9092:20180401201316p:plain

f:id:yh9092:20180401201329p:plain

f:id:yh9092:20180401201422p:plain

ウインドウのサイズに応じて、描画するもののサイズを変更し、全体を表示できるようにしたプログラムです。

比率をScale関数に入れるだけなので、それ以外の部分を考慮せずにUIを作ることができるのが利点です。

例外処理について

このウインドウサイズ変更ですが、サイズを特定の大きさに変更しようとしたとき、環境によるかもしれませんがエラーが発生します。
height(高さ)を0以下にしようとドラッグすると、コマンドラインにこのように表示され動作が停止します。

java.lang.IllegalArgumentException: Width (500) and height (0) cannot be <= 0
	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016) …

これはたぶんProcessing側の問題であると思います。

解決するにはサンプルプログラムのようにIllegalArgumentExceptionを関数全体でthrowsしてやるか、プログラム全体にtry,catchの例外処理でIllegalArgumentExceptionをはじいてやる必要があります。

しかし、Javaとは違い完全なオブジェクト指向ができない(void setup()等をクラスにできない)Processingでは、わざわざこの処理をすべての範囲で記述するのは現実的ではありません。

まあウインドウの高さを負にする機会もないでしょうし、あまり気にする必要もないかもしれませんね。

なにか解決策がありましたら、教えてください。


それでは。