• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JInternalFrameを一番手前に表示
#navi(../)
*JInternalFrameを一番手前に表示 [#nf40bd6e]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-06-21~
更新日:&lastmod;
---
category: swing
folder: LayeredPane
title: JInternalFrameを一番手前に表示
tags: [JLayeredPane, JInternalFrame, JDesktopPane]
author: aterai
pubdate: 2004-06-21T07:16:58+09:00
description: JLayeredPaneを使って、常に一番手前に表示されるJInternalFrameを作成します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTO8wLpaZI/AAAAAAAAAdM/mML3cGeQwrg/s800/LayeredPane.png
---
* 概要 [#summary]
`JLayeredPane`を使って、常に一番手前に表示される`JInternalFrame`を作成します。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTO8wLpaZI/AAAAAAAAAdM/mML3cGeQwrg/s800/LayeredPane.png)

**概要 [#e3d9376f]
JLayeredPaneを使って、常に一番手前に表示されるJInternalFrameを作成します。

#screenshot

**サンプルコード [#m9667d72]
#code{{
boolean isFirst = true;
protected void createFrame() {
  MyInternalFrame frame = new MyInternalFrame();
  frame.setVisible(true);
  if(isFirst) {
    desktop.add(frame, new Integer(JLayeredPane.DEFAULT_LAYER.intValue()+1));
    isFirst = false;
  }else{
    desktop.add(frame);
  }
  try{
    frame.setSelected(true);
  }catch(java.beans.PropertyVetoException e) {}
}
* サンプルコード [#sourcecode]
#code(link){{
JInternalFrame iframe = new JInternalFrame(
  "AlwaysOnTop", // title
  true,  // resizable
  false, // closable
  true,  // maximizable
  true); // iconifiable
iframe.setSize(180, 180);
desktop.add(iframe, Integer.valueOf(JLayeredPane.MODAL_LAYER + 1));
iframe.setVisible(true);
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#b28fb803]
上記のサンプルでは、一番最初に作成したフレームがJLayeredPane.DEFAULT_LAYERより一つ上のレイヤーに追加されているため、後から追加されたフレームは、これより手前に表示することが出来なくなっています。
* 解説 [#explanation]
`JDesktopPane`は`JLayeredPane`を継承しているため、`JInternalFrame`を追加するレイヤーを指定可能です。このサンプルでは、タイトルが`AlwaysOnTop`の`JInternalFrame`を`JLayeredPane.MODAL_LAYER`の一つ上に設定し、他の`JInternalFrame`(ここでは後から追加する`JInternalFrame`)より常に手前に表示されるように設定しています。

**参考リンク [#a60bf0d2]
-[[JInternalFrameは最初にアイコン化しておかないと位置が更新されない>http://d.hatena.ne.jp/tori31001/20060901]]
-- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4110799
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JLayeredPane.html JLayeredPane (Java Platform SE 8)]
- [http://d.hatena.ne.jp/tori31001/20060901 JInternalFrameは最初にアイコン化しておかないと位置が更新されない]
-- [https://bugs.openjdk.org/browse/JDK-4110799 JDK-4110799 JInternalFrame icon position unchanged w/ resize - Java Bug System]

**コメント [#v1a558f1]
-1.5でJFrameなどは、frame.setAlwaysOnTop(true)が使えるようになっています。 -- [[terai]] &new{2004-10-08 (金) 17:00:59};
-ありがとうございます。現在GUIの作成をしていて、目下この情報を探していました。ありがとうございました -- [[G]] &new{2004-12-24 (金) 12:00:00};
* コメント [#comment]
#comment
- `JDK 1.5.0`で`JFrame`などは、`frame.setAlwaysOnTop(true)`が使えるようになっています。 -- &user(aterai); &new{2004-10-08 (金) 17:00:59};
- ありがとうございます。現在`GUI`の作成をしていて、目下この情報を探していました。ありがとうございました -- &user(G); &new{2004-12-24 (金) 12:00:00};
-- どういたしまして。 -- [[aterai]]

#comment