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が変わっているはず。
おそらくかなり強引な方法に思えるが、目的の動作ができたので良しとした。