次Javaで表示するスクリーンを選ぶ大きい方のディスプレイに表示させるには諸事情でメインのディスプレイをセカンダリに、小さなディスプレイをプライマリに設定して使うことにした。久しぶりに画像を表示する自作のJavaプログラムを起動すると、小さなディスプレイではうまく動かない。この不具合にも対策が必要だが、どちらにしても、大きい方のディスプレイを使うようにプログラムしたい。環境を再び替えることもあろうから、セカンダリと決めてかかるのはよくない。今回の問題は高さだったので、縦の解像度の大きい方ということにした。概要はGraphics­Environment#get­Screen­Devices()でGraphics­Deviceの配列を得る。gc);でフレームを生成する以上についてプログラムを紹介する追記JFrame#setLocationByPlatform(true);を指定しておくことで、javaプログラムの起動端末の表示されているスクリーンが自動的に選択されるらしいとわかった。デフォルトのスクリーン内でのおまかせ配置だと思っていた。昔にOSによっては動かなかったり、配置が気に入らなかったりしてずっと使っていなかったので、あまり期待をしていなかったというので発見が遅れた。きっかけとなったプログラムにこれが書いてあったら、今回の調査に至らなかったが、やれることが広がったので良しとする。デバイスを得るGraphicsEnvironment#getScreenDevices()でGraphicsDeviceの配列を得る。GraphicsEnvironment#get­Default­Screen­Device()でデフォルトのGraphicsDeviceを得る。}}GraphicsDeviceは、画面、プリンタ、またはイメージ・バッファの場合があると書いてあるが、画面だけ、つまり、Screen0,1が得られる。デフォルトは0である。X11GraphicsDevice[screen=0]デバイスからGraphicsConfiguration各GraphicsDeviceは、それに関連したいくつかのGraphicsConfigurationオブジェクトを持つということなので、調べる。}}Deviceごとに240のConfigurationがある。この出力ではvisの値だけが異なる。5番目まで表示させているがこの後も同じ。bBounds:java.awt.Rectangle[x=0,y=0,width=1920,height=1200]VBounds:java.awt.Rectangle[x=0,y=0,width=3200,height=1200]lastConf:X11GraphicsConfig[dev=X11GraphicsDevice[screen=1],vis=0x21]java.awt.Point[x=2560,y=688]java.awt.Rectangle[x=1920,y=176,width=1280,height=1024]API仕様には各Confを使ってJFrameオブジェクトを生成する例が出ている。どれも同じなので、それぞれのデバイスのデフォルトのConfだけを使って、TreeMapでheightが最大なもの(last)を得ている。virtualBounds.union(drectn)で、合成された仮想スクリーンを得ている合成[x=0,y=0,width=3200,height=1200]dev1[x=0,y=0,width=1920,height=1200],dev2[x=1920,y=176,width=1280,height=1024]最後は、Graphics­Environment­#get­Center­Point()とGraphics­Environment­#get­Maximum­Window­Bounds()だが、仮想デバイスのセンターではなく、仮想デバイスの座標で見たデフォルトデバイスのセンターの座標と、最大のサイズということらしい。このプログラムで出てくる値はすべて仮想デバイスの座標だけれども。}}これで空のJFrameが1920x1200の方へ表示される。ScreenTest02[:0.0][1920.0,1920.0,1280.0,1024.0][:0.1][0.0,0.0,1920.0,1200.0]lastConf:X11GraphicsConfig[dev=X11GraphicsDevice[screen=1],vis=0x21]クリックでスクリーン間の移動をするプログラム複数あるスクリーン間をJFrameが移動するプログラムを作ってみる。表示後は仮想スクリーン内の座標になるので、GraphicsConfigurationで切り替えるのではなく、単なる座標指定となる。今回の例では、1280x1024と1920x1200が合成されて、3200x1200のスクリーンになっている。}}actionPerformed()内で、個別スクリーンの左上の座標を求めて、現在の位置から引いて、個別スクリーン内の位置をdx,dyに格納。その後次のGraphicsConfigurationから移動先のスクリーンの左上座標を求め、dx,dyを足して移動先とする。JFrame#getLocationOnScreen()もJFrame#getLocation()も変わりない。安達順一(2019-06-21)https://dabiyone.com/。