TITLE:DesktopManagerでアイコンの再配置

DesktopManagerでアイコンの再配置

編集者:Terai Atsuhiro~

作成日:2007-01-15
更新日:2023-06-09 (金) 11:16:24
  • category: swing folder: RelocatedIcon title: DesktopManagerでアイコンの再配置 tags: [DesktopManager, JDesktopPane, JInternalFrame] author: aterai pubdate: 2007-01-15T12:27:58+09:00 description: JDesktopPaneのサイズが変更されたとき、アイコン化しているJInternalFrameの再配置を行います。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTRm01W30I/AAAAAAAAAhc/eBhL-DDKkSo/s800/RelocatedIcon.png

概要

JDesktopPaneのサイズが変更されたとき、アイコン化しているJInternalFrameの再配置を行います。[JDK-4765256] REGRESSION: Icons in JDesktopPane not repositioned when pane is resized - Java Bug Systemからソースコードの大部分を引用しています。

概要

JDesktopPaneのサイズが変更されたとき、アイコン化しているJInternalFrameの再配置を行います。Bug ID: 4765256 REGRESSION: Icons in JDesktopPane not repositioned when pane is resizedからソースコードの大部分を引用しています。

サンプルコード

#spanend
#spanadd
class ReIconifyDesktopManager extends DefaultDesktopManager {
#spanend
  public void reIconifyFrame(JInternalFrame jif) {
    deiconifyFrame(jif);
    Rectangle r = getBoundsForIconOf(jif);
    iconifyFrame(jif);
    jif.getDesktopIcon().setBounds(r);
  }
#spanadd
}
#spanend

#spandel
#screenshot
#spanend
#spandel

#spanend
#spandel
**サンプルコード [#v3086042]
#spanend
#spandel
#code{{
#spanend
 class ReIconifyDesktopManager extends DefaultDesktopManager {
   public void reIconifyFrame(JInternalFrame jif) {
     deiconifyFrame(jif);
     Rectangle r = getBoundsForIconOf(jif);
     iconifyFrame(jif);
     jif.getDesktopIcon().setBounds(r);
   }
 }
#spandel

#spanend
 ......
 ReIconifyDesktopManager rdm = new ReIconifyDesktopManager();
 desktop.setDesktopManager(rdm);
 desktop.addComponentListener(new ComponentAdapter() {
   public void componentResized(ComponentEvent ce) {
     JDesktopPane dp = (JDesktopPane)ce.getComponent();
     ReIconifyDesktopManager dm = (ReIconifyDesktopManager)dp.getDesktopManager();
     JInternalFrame[] jif = dp.getAllFrames();
     for(int i=0;i<jif.length;i++) {
       if(jif[i].isIcon()) dm.reIconifyFrame(jif[i]);
     }
   }
 });
 ......
#spanadd
private void doReIconify(JDesktopPane desktopPane) {
#spanend
  DesktopManager dm = desktopPane.getDesktopManager();
  if (dm instanceof ReIconifyDesktopManager) {
    ReIconifyDesktopManager rdm = (ReIconifyDesktopManager) dm;
    for (JInternalFrame f: desktopPane.getAllFrames()) {
      if (f.isIcon()) {
        rdm.reIconifyFrame(f);
      }
    }
  }
#spanadd
}
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、JToggleButtonが選択されている場合、再配置を行っています。

解説

  • JDesktopPaneがリサイズされた場合、以下のような手順で再配置を実行
    • GTKLookAndFeelを使用する場合、アイコンの移動自体がデフォルトでは不可なのでこの設定は無意味になる
JDesktopPaneがリサイズされた場合、以下のような手順で再配置を行っています。
  • アイコン化したJInternalFrame を一旦、元のサイズと位置に復元
  • アイコン化した場合の位置を再計算
  • 再びアイコン化
  • 再計算した位置への移動
  1. アイコン化したJInternalFrameを一旦元のサイズと位置に復元
  2. アイコン化した場合の位置を再計算
  3. 再びアイコン化
  4. 再計算した位置への移動

参考リンク

参考リンク

コメント

コメント