■正拳突きのHP:プログラムチップス(java swing)マルチモニタ対応フルスクリーン設定/解除

* 作成日:2009/02/08
* 作成環境:windows XP java1.6 eclipse4.4

* ウィンドウの座標と、各画面の範囲を比較し、それっぽい画面にフルスクリーン表示します。
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 * マルチモニタ対応フルスクリーン設定/解除
 * ウィンドウの座標と、各画面の範囲を比較し、それっぽい画面にフルスクリーン表示します。
 * 作成日:2009/02/08
 * 作成環境:windows XP java1.6 eclipse4.4
 */
public class FullScreenSample extends JFrame {

	protected GraphicsDevice device = null;

	public static void main(String[] args) {
		FullScreenSample f = new FullScreenSample();
		f.setVisible(true);
	}

	public FullScreenSample() {
		addMouseListener(new MouseListener() {

			@Override
			public void mouseClicked(MouseEvent e) {
				setFullScreen();
			}

			@Override
			public void mouseEntered(MouseEvent e) {
			}

			@Override
			public void mouseExited(MouseEvent e) {
			}

			@Override
			public void mousePressed(MouseEvent e) {
			}

			@Override
			public void mouseReleased(MouseEvent e) {
			}
		});
		setBounds(100, 100, 400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JLabel label = new JLabel("クリックするとフルスクリーンになったり戻ったりします。");
		add(label);
	}

	private void setFullScreen() {
		// デコレーションの有無でフルスクリーン設定/解除を切り替える。
		setFullScreen(!isUndecorated());
	}

	private void setFullScreen(boolean fullFlg) {
		if (fullFlg) {
			// GraphicsDevice取得

			GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

			// フレームの4隅と中央の座標取得
			Point center = new Point((int)this.getBounds().getCenterX(),(int)this.getBounds().getCenterY());
			Point a = new Point((int)this.getBounds().getMinX(),(int)this.getBounds().getMinY());
			Point b = new Point((int)this.getBounds().getMaxX(),(int)this.getBounds().getMinY());
			Point c = new Point((int)this.getBounds().getMaxX(),(int)this.getBounds().getMaxY());
			Point d = new Point((int)this.getBounds().getMaxX(),(int)this.getBounds().getMinY());
			Point[] plist = {d,c,b,center,a};

			device = null;

			// フレームの座標と、画面の範囲を比較し、フルスクリーン表示する画面を決定
			GraphicsDevice[] glist = ge.getScreenDevices();
			String s = "";
			for (Point p : plist) {
				for(GraphicsDevice g : glist) {
					if (g.getDefaultConfiguration().getBounds().contains(p)) {
						s = g.toString();
						break;
					}
				}
			}

			/*
			 * 1回目のループでtoStringを使い文字列を取得。
			 * 2回目のループで文字列を比較しGraphicsDevice。
			 * 通常の環境では1回目のループで取得すればよいと思うのですが、
			 * 作者の環境では、それだとフルスクリーン解除時にエラーがでるんです(;;
			 */
			glist = ge.getScreenDevices();
			for(GraphicsDevice g : glist) {
				if (s.equals(g.toString())) {
					device = g;
					break;
				}
			}

			// 画面が取得できていない場合、デフォルトスクリーン
			if (device == null) {
				device = ge.getDefaultScreenDevice();
			}

			// フルスクリーン設定
			dispose();
			setVisible(false);
			setUndecorated(true);
			device.setFullScreenWindow(this);
			setVisible(true);
		} else {

			// フルスクリーン解除
			dispose();
			setVisible(false);
			setUndecorated(false);
			device.setFullScreenWindow(null);
			setVisible(true);

			device = null;
		}
	}
}

TOPに戻る