概要

JInternalFrameをアイコン化したときに使用されるJDesktopIconのサイズを変更します。

サンプルコード

UIManager.put("DesktopIcon.width", 150);
// ...
JInternalFrame f = new JInternalFrame(t, true, true, true, true);
f.setDesktopIcon(new JInternalFrame.JDesktopIcon(f) {
  @Override public Dimension getPreferredSize() {
    return new Dimension(150, 40);
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JInternalFrameをアイコン化したときに使用されるJDesktopIconのサイズ変更をLookAndFeel毎にテストしています。

  • UIManager.put("DesktopIcon.width", DESKTOPICON_WIDTH);
    • MetalLookAndFeelWindowsLookAndFeelなどでJDesktopIconの幅を指定可能
    • NimbusLookAndFeelMotifLookAndFeelでは無効
  • Override: JInternalFrame.JDesktopIcon#getPreferredSize()
    • JInternalFrame.JDesktopIcon#getPreferredSize()メソッドをオーバーライドしてLookAndFeelに依存せずにサイズを変更
    • MotifLookAndFeelの場合、タイトルバー状ではなくアイコン状なのでnew Dimension(64, 64 + 32)を使用

  • デフォルト状態のNimbusLookAndFeelJDesktopIconの高さがJInternalFrameによって変化する?
  • DefaultDesktopManager#getBoundsForIconOf(...)メソッドをオーバーライドしてサイズ変更
    desktop.setDesktopManager(new DefaultDesktopManager() {
      @Override protected Rectangle getBoundsForIconOf(JInternalFrame f) {
        Rectangle r = super.getBoundsForIconOf(f);
        r.width = 200;
        return r;
      }
    });
    
  • DefaultDesktopManager#getBoundsForIconOf(...)メソッドをオーバーライドする方法もある
    desktop.setDesktopManager(new DefaultDesktopManager() {
      @Override public void iconifyFrame(JInternalFrame f) {
        Rectangle r = this.getBoundsForIconOf(f);
        r.width = f.getDesktopIcon().getPreferredSize().width;
        f.getDesktopIcon().setBounds(r);
        super.iconifyFrame(f);
      }
    });
    

参考リンク

コメント