Swing/RelocatedIcon のバックアップの現在との差分(No.2)
TITLE:DesktopManagerでアイコンの再配置
DesktopManagerでアイコンの再配置
編集者:Terai Atsuhiro~
作成日:2007-01-15
更新日:2023-06-09 (金) 11:16:24
概要
JDesktopPane
のサイズが変更されたとき、アイコン化しているJInternalFrame
の再配置を行います。[JDK-4765256] REGRESSION: Icons in JDesktopPane not repositioned when pane is resized - Java Bug Systemからソースコードの大部分を引用しています。
Screenshot
Advertisement
概要
JDesktopPaneのサイズが変更されたとき、アイコン化しているJInternalFrameの再配置を行います。Bug ID: 4765256 REGRESSION: Icons in JDesktopPane not repositioned when pane is resizedからソースコードの大部分を引用しています。#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
class ReIconifyDesktopManager extends DefaultDesktopManager {
public void reIconifyFrame(JInternalFrame jif) {
deiconifyFrame(jif);
Rectangle r = getBoundsForIconOf(jif);
iconifyFrame(jif);
jif.getDesktopIcon().setBounds(r);
}
}
#spandel
//......
#spanend
#spandel
ReIconifyDesktopManager rdm = new ReIconifyDesktopManager();
#spanend
#spandel
desktop.setDesktopManager(rdm);
#spanend
#spandel
desktop.addComponentListener(new ComponentAdapter() {
#spanend
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
#spanend
#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);
}
}
}
#spandel
});
#spanend
#spandel
//......
#spanend
#spanadd
}
#spanend
- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルでは、JToggleButtonが選択されている場合、再配置を行っています。解説
-
JDesktopPane
がリサイズされた場合、以下のような手順で再配置を実行-
GTKLookAndFeel
を使用する場合、アイコンの移動自体がデフォルトでは不可なのでこの設定は無意味になる
-
- アイコン化したJInternalFrame を一旦、元のサイズと位置に復元
- アイコン化した場合の位置を再計算
- 再びアイコン化
- 再計算した位置への移動
- アイコン化した
JInternalFrame
を一旦元のサイズと位置に復元 - アイコン化した場合の位置を再計算
- 再びアイコン化
- 再計算した位置への移動
参考リンク
- Bug ID: 4765256 REGRESSION: Icons in JDesktopPane not repositioned when pane is resized
- Bug ID: 4110799 JInternalFrame icon position unchanged w/ resize
参考リンク
- [JDK-4765256] REGRESSION: Icons in JDesktopPane not repositioned when pane is resized - Java Bug System
- [JDK-4110799] JInternalFrame icon position unchanged w/ resize - Java Bug System