生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

setAlwaysOnTopを使って、JFrameの表示順番を変える

複数のJFrameを開いている時に、あるaction後に特定のJFrameを最前列に表示するプログラムを書く。

ここでは、2つの写真をJFrameで表示し、JButtonによって最前列のJFrameを変えてみた。

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FrameTest extends JFrame implements ActionListener {

	BufferedImage img;
	BufferedImage nextImg;
	JFrame imgFrame;
	JFrame nextFrame;
	MyPanel mypane;
	MyPanel2 mypane2;

	//画像を表示する
	public void OpenImage() {
		try {
			File openFile = new File ("貼り付ける一つめの写真 (A)");
			File nextFile = new File ("貼り付ける一つめの写真 (B)");
			img = ImageIO.read(openFile);
			nextImg = ImageIO.read(nextFile);

			} catch (IOException ex) {
				System.out.println("Miss");
			}

		//画像をフレームに貼る
	    imgFrame = new JFrame("A Image");
		nextFrame = new JFrame ("B Image");
		imgFrame.setBounds (300, 100, 520, 410);
		nextFrame.setBounds (400, 120, 520, 410);
		imgFrame.setVisible(true);
		nextFrame.setVisible(true);
		mypane = new MyPanel (520, 410);
		mypane2 = new MyPanel2 (520, 500);
		imgFrame.getContentPane().add(mypane, BorderLayout.CENTER);
		nextFrame.getContentPane().add(mypane2, BorderLayout.CENTER);
	}

	//画像を貼る用のツール
	public class MyPanel extends JPanel {
		public MyPanel (int width, int height) {
			setSize (width, height);
		}

		public void paintComponent (Graphics g) {
			g.drawImage(img, 10, 10, this);
		}
	}

	//画像を貼る用のツール2
	public class MyPanel2 extends JPanel {
		public MyPanel2 (int width, int height) {
			setSize (width, height);
		}

		public void paintComponent (Graphics g) {
			g.drawImage(nextImg, 10, 10, this);
		}
	}

	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();

		if (cmd.equals("open")) {
			OpenImage();
		} else if (cmd.equals("a")) {
			imgFrame.setAlwaysOnTop(true); //A imageを最前列へ
			nextFrame.setAlwaysOnTop(false);
		} else if (cmd.equals("b") ) {
			imgFrame.setAlwaysOnTop(false);
			nextFrame.setAlwaysOnTop(true);  //B  imageを最前列へ
		}
	}

	FrameTest () {
		JButton openB = new JButton ("Open");
		JButton aB = new JButton ("A Image");
		JButton bB = new JButton ("B Image");
		openB.addActionListener (this);
		aB.addActionListener(this);
		bB.addActionListener (this);
		openB.setActionCommand("open");
		aB.setActionCommand("a");
		bB.setActionCommand("b");

		openB.setBounds(30, 10, 100, 30);
		aB.setBounds(30, 50, 100, 30);
		bB.setBounds(30, 90, 100, 30);
		JPanel pane = new JPanel();
		pane.setLayout(null);
		pane.add(openB);
		pane.add(aB);
		pane.add(bB);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		FrameTest frame = new FrameTest();
		frame.setTitle("Test");
		frame.setBounds(10, 10, 180, 170);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible (true);
	}
}

JFrameの表示順番を変えるために、

	imgFrame.setAlwaysOnTop(true); //A imageを最前列へ
	nextFrame.setAlwaysOnTop(false);

を使って、最前列に表示させるJFrameの入れ替えを行っている。このプログラムで、ボタンを押すごとに最前列のJFrameが変わっているはず。

おそらくかなり強引な方法に思えるが、目的の動作ができたので良しとした。