◆PROCESSING 逆引きリファレンス
カテゴリー:制御系
実行結果ウィンドウを常に最前面に表示するには(3.X用)
【解説】
《本記事の内容は PROCESSING 3.X用です。2.X以前では利用できません》
PROCESSINGの実行結果ウィンドウは、デフォルトではWindowの重なりを許可しているため、他のWindowの下に隠れる事があります。
たとえば下図のような感じです。
この例では、サクラエディタのWindowの下に実行結果Windowが隠れています。
それでは、実行結果Windowが他のWindowの下に隠れることが無いようにするにはどうしたら良いでしょうか?。
PROCESSING3.Xでは、PApplet内にグラフィクス表示用のPSurfaceインタフェース型の変数(processing.core.PSurfaceNoneクラスのインスタンス?)を保持しています。
このPSurfaceクラスが持つ setAlwaysOnTop( ) メソッドを利用する事で、実行結果Windowの重なり具合を変更できます。
Psurfaceクラスのインスタンス変数は、PROCESSING内部で surface という名前のグローバル変数として定義されています。またPAppletクラスのgetSurface()メソッドを利用する事でも取得可能です。
なお現在表示中の実行結果Windowが、重なりを許可されているかどうかを知るには、JavaのFrameクラスが持つ isAlwaysOnTop( ) メソッドを利用する必要があります。
Psurfaceが持っている java.awt.Frameを得る方法については、下記注意事項および「実行結果ウィンドウの位置を制御するには(3.X用)」記事を参考としてください。
【構文】
●PAppletが持つ PSurface を得る
PSurface suf = this . getSurface( ) ;
suf:PAppletが持つPSurfaceインタフェース変数
または surface というグローバル変数を利用する
●Windowの重なりを制御する
void sur . setAlwaysOnTop( boolean setTop ) ;
sur :PSurfaceインタフェース変数
setTop:True なら常に最前面。False なら重なり許可
●重なり許可状態を取得する
PSurfaceAWT.SmoothCanvas canvas = surface . getNative( ) ;
java.awt.Frame frame = canvas . getFrame( ) ;
boolean isTop = frame . isAlwaysOnTop( );
canvas:PSurfaceAWT.SmoothCanvas のインタフェース変数
frame :実行結果ウィンドウの表示用フレーム
isTop :Windowの重なり許可状態。True なら常に最前面。False なら重なり許可
【注意】
PAppletが持つPSurfaceインタフェース変数は settings() 関数の中でgetSurface( )する事はできません。settings()の中でgetSurface( )すると NULL が戻されます。
同様にsettings() 関数の中で surface 変数を利用すると Null Pointer Exception例外となります。ここは注意してください。
現在表示中の実行結果Windowが、重なりを許可されているかどうかを知るには、JavaのFrameクラスが持つメソッドを利用する必要があります。
Psurfaceインタフェースの getNative() メソッドでは、 processing.awt.PSurfaceAWT.SmoothCanvasクラスのインスタンス変数を得ることができます。
このPSurfaceAWT.SmoothCanvasが持つ getFrame()メソッドを実行すると、実行結果ウィンドウが持つ表示用フレーム(java.awt.Frame)を得る事ができます。
【関連記事】
サンプルプログラム
常に最前面化する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup(){ size(300,100); //テキストの表示位置と大きさ指定 textAlign( LEFT, TOP); textSize( 24 ); //最前面化します surface.setAlwaysOnTop(true); //以下のようにしてもOK //PSurface sur = getSurface(); //sur.setAlwaysOnTop(true); } void draw() { background(0); text( "Now AllwaysOnTop", 0, 0 ); } |
これを実行すると、表示される実行結果Windowが常に最前面化され、他のWindowに隠れなくなります。
重なり許可状態を取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import java.awt.Frame; import java.awt.Image; import processing.awt.PSurfaceAWT; void setup(){ size(300,100); //文字の大きさと位置を指定 textAlign( LEFT, TOP); textSize(24); } //実行結果ウィンドウのFrameを取得する Frame getFrame() { PSurfaceAWT.SmoothCanvas canvas; canvas = (PSurfaceAWT.SmoothCanvas)getSurface().getNative(); return( canvas.getFrame() ); } void draw() { background(0); //画面に状態を表示する if( getFrame().isAlwaysOnTop() ){ //常に最前面状態 text( "Now AlwaysOnTop", 0, 0 ); } else { //重なりを許す状態 text( "Now CanOverlap", 0, 0 ); } } |
実行結果Windowの重なりが許可されているかどうかを取得し、画面に表示します。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。