Swing/DesktopIconSize の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/DesktopIconSize へ行く。
- Swing/DesktopIconSize の差分を削除
--- category: swing folder: DesktopIconSize title: JInternalFrameをアイコン化した場合のサイズを変更する tags: [JInternalFrame, JDesktopPane, LookAndFeel, JDesktopIcon] author: aterai pubdate: 2016-02-15T00:00:57+09:00 description: JInternalFrameをアイコン化したときに使用されるJDesktopIconのサイズを変更します。 image: https://lh3.googleusercontent.com/-TEU2w7fUDtA/VsCIqEiNtoI/AAAAAAAAONk/VP5SO5nYnuw/s800-Ic42/DesktopIconSize.png --- * 概要 [#summary] `JInternalFrame`をアイコン化したときに使用される`JDesktopIcon`のサイズを変更します。 #download(https://lh3.googleusercontent.com/-TEU2w7fUDtA/VsCIqEiNtoI/AAAAAAAAONk/VP5SO5nYnuw/s800-Ic42/DesktopIconSize.png) * サンプルコード [#sourcecode] #code(link){{ 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); } }); }} * 解説 [#explanation] 上記のサンプルでは、`JInternalFrame`をアイコン化したときに使用される`JDesktopIcon`のサイズ変更を`LookAndFeel`毎にテストしています。 - `UIManager.put("DesktopIcon.width", DESKTOPICON_WIDTH);` -- `MetalLookAndFeel`、`WindowsLookAndFeel`などで`JDesktopIcon`の幅を指定可能 -- `NimbusLookAndFeel`、`MotifLookAndFeel`では無効 - `Override: JInternalFrame.JDesktopIcon#getPreferredSize()` -- `JInternalFrame.JDesktopIcon#getPreferredSize()`メソッドをオーバーライドして`LookAndFeel`に依存せずにサイズを変更 -- `MotifLookAndFeel`の場合、タイトルバー状ではなくアイコン状なので`new Dimension(64, 64 + 32)`を使用 ---- - デフォルト状態の`NimbusLookAndFeel`で`JDesktopIcon`の高さが`JInternalFrame`によって変化する? -- 起動時からの`JInternalFrame`: `height=33`、後でボタンから追加した`JInternalFrame`: `height=27` -- [https://bugs.openjdk.java.net/browse/JDK-7126823 JDK-7126823 JInternalFrame.getNormalBounds() returns bad value after iconify/deiconify - Java Bug System] -- [https://bugs.openjdk.org/browse/JDK-7126823 JDK-7126823 JInternalFrame.getNormalBounds() returns bad value after iconify/deiconify - Java Bug System] - `DefaultDesktopManager#getBoundsForIconOf(...)`メソッドをオーバーライドしてサイズ変更 #code{{ desktop.setDesktopManager(new DefaultDesktopManager() { @Override protected Rectangle getBoundsForIconOf(JInternalFrame f) { Rectangle r = super.getBoundsForIconOf(f); r.width = 200; return r; } }); }} - `DefaultDesktopManager#getBoundsForIconOf(...)`メソッドをオーバーライドする方法もある #code{{ 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); } }); }} * 参考リンク [#reference] - [https://stackoverflow.com/questions/35287367/changing-desktopicon-width-on-nimbus java - Changing DesktopIcon.width on nimbus - Stack Overflow] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JInternalFrame.JDesktopIcon.html JInternalFrame.JDesktopIcon (Java Platform SE 8)] - [[JInternalFrameのタイトル文字列幅を取得し、その値でJDesktopIconの幅を調整する>Swing/ComputeTitleWidth]] * コメント [#comment] #comment #comment